zoukankan      html  css  js  c++  java
  • 异步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。

     

     

  • 相关阅读:
    SpringBoot整合系列-整合H2
    SpringBoot整合系列-整合Swagger2
    BZOJ3626 [LNOI2014]LCA
    BZOJ4475 [Jsoi2015]子集选取
    BZOJ4466 [Jsoi2013]超立方体
    BZOJ3997 [TJOI2015]组合数学
    BZOJ3996 [TJOI2015]线性代数
    BZOJ2227 [Zjoi2011]看电影(movie)
    BZOJ2337 [HNOI2011]XOR和路径
    BZOJ2330 [SCOI2011]糖果
  • 原文地址:https://www.cnblogs.com/terencezhou/p/2605308.html
Copyright © 2011-2022 走看看