异步io框架gevent安装备忘

摘要:

以非root权限安装gevent,及两个依赖库libevent与greenlet。

引言:

最近想了解一些python的异步io框架,之前看了twisted,鼻祖级的python异步io框架。这个框架要求程序员以reactor/callback模型编写应用程序,应用程序向reactor提交io请求时需要指定一个回调函数,或者利用defered管理回调函数。在公司接触过C版本的异步io框架,编程模型与twisted一致。之后,看博客又了解到不少python的异步io框架,Tornado,gevent,eventlet,concurrence等。Nicholas Piël在其博客[1]中(http://nichol.as/asynchronous-servers-in-python),对这些异步io框架做了一个对比。从结果上看,gevent在各项benchmark中都表现非常出色,并且与已有的python标准库兼容,能够在几乎不改动旧代码的情况下,应用该异步io框架。

鉴于我对这些io框架都不太了解,所以跟着潮流走,选个看上去最有前途的入手。

本备忘录分4部分:1、gevent依赖的库;2、libevent安装;3、greenlet安装;4、gevent安装。

gevent依赖的库:

gevent依赖于greenlet,利用其coroutine特性,我选择greenlet-0.4.0最新版本。

gevent依赖于libevent,文档介绍需要1.4.x版本,我选择1.4.14b-stable。看其他人的博客,貌似2.x版本都不行,非得这个版本。

libevent安装:

  1. 下载并解压libevent-1.4.14b-stable.tar.gz;
  2. ./configure –prefix=‘mypath’ ;
  3. make。在这遇到一个错误,貌似是和libtool版本有关的问题。

    libtool: Version mismatch error. This is libtool 2.2.6b, but the
    libtool: definition of this LT_INIT comes from an older release.
    libtool: You should recreate aclocal.m4 with macros from libtool 2.2.6b
    libtool: and run autoconf again.

    解决方案为。

    1). make maintainer-clean 清理

    2). autoreconf --force --install  这个命令不知道干什么的,然后重新执行2,3两部,无错误。

4. make install。

安装完成,在mypath下出现lib,include,man,bin四个子目录。

greenlet安装:

因为不具备root权限,greenlet安装到的python只是/home/myname下的一个python。

  1. 下载并解压greenlet-0.4.0.tar;
  2. easy_install greenlet --prefix='/home/myname/local/python/'

    在这里也遇到一个错误。

You are attempting to install a package to a directory that is not
on PYTHONPATH and which Python does not read ".pth" files from.

    修改PYTHONPATH,通过export PYTHONPATH=$PYTHONPATH:/home/myname/local/python/lib/python2.7/site-packages增加该路径,后无错误出现。

gevent安装:

  1. 下载并解压gevent-0.13.7.tar.gz;
  2. setup.py build --libevent 'my/libevent/path'
  3. setup.py install

这里也遇到些问题,python进入命令行后,import gevent会出现错误 ImportError: gevent/core.so: undefined symbol: evdns_resolve_ipv6。

在网上看了大家遇到的问题,发现应该是链接的libevent版本不正确,这类问题大多出现在安装了多个libevent,且默认版本不是1.4.X。进入libevent的安装目录,将lib目录修改为.libs目录,不知道为啥setup.py会在安装目录下的.libs/子目录去寻找libevent.so,而不是默认的lib/目录。然后再将这个.libs/子目录加入到LD_LIBRARY_PATH里去。清理后再重现执行2,3两个步骤,完成安装。

小结:

没有root权限真TM麻烦。因为LD_LIBRARY_PATH是在.bashrc里设置的,如果通过crontab来执行包含gevent的python脚本,还需先执行export命令,把自己的libevent.so的路径加到LD_LIBRARY_PATH里。orz。

 

 

原文地址:https://www.cnblogs.com/terencezhou/p/2605308.html