异步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安装:
- 下载并解压libevent-1.4.14b-stable.tar.gz;
- ./configure –prefix=‘mypath’ ;
- 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。
- 下载并解压greenlet-0.4.0.tar;
- 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安装:
- 下载并解压gevent-0.13.7.tar.gz;
- setup.py build --libevent 'my/libevent/path'
- 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。