uwsgi、virtualenv 、pypy和flask
当前linux发行版python版本默认基本上都是2.7的,如果系统中有了python3.0以后的,或者自己安装了
python3.3,但是用pip或者easy_install安装python3的module并不很方面,使用virtualenv就方便多了,
安装pypy环境较好的办法也是用virtualenv。通过如下:
virtualenv -p /path/to/python3 dir_name
当然前提是你安装了virtualenv,如下安装:
sudo apt-get install python-virtualenv或者sudo pip install virtualenv。
用virtualenv会在当前目录中生成dir_name目录,这样就生成了python3的虚拟环境,具体使用就不啰嗦了,
毕竟virtualenv网上介绍的很多了。
那么同样的方法我们用virtualenv -p /path/to/pypy virtualpypy,创建一个virtualpypy目录。进入
virtualpypy,然后source bin/activate,在使用pip或者easy_install安装的库就可以了,比如安装了flask,
想让uwsgi运行起来有点麻烦,需要用pip在虚拟环境中安装uwsgi:pip install uwsgi,这样会编译一个
适合pypy的uwsgi。
uwsgi.xml文件如下:
1 <uwsgi> 2 <socket>0.0.0.0:6001</socket> 3 <listen>20</listen> 4 <chdir>/path/to/virtualpypy</chdir> 5 <pythonpath>/path/to/virtualpypy</pythonpath> 6 <virtualenv>/path/to/virtualpypy</virtualenv> 7 <processes>3</processes> 8 <master>true</master> 9 <pidfile>/path/to/virtualpypy/uwsgi.pid</pidfile> 10 <wsgi-file>/path/to/virtualpypy/application.py</wsgi-file> 11 <profiler>true</profiler> 12 <memory-report>true</memory-report> 13 <enable-threads>true</enable-threads> 14 <no-site>true</no-site> 15 <pypy-lib>/path/to/virtualpypy/libpypy-c.so</pypy-lib> 16 <logdate>true</logdate> 17 <limit-as>6048</limit-as> 18 </uwsgi>
注意第15行,如果没有libpypy-c.so这个动态链接库,uwsgi -x uwsgi.xml就会报错。
我们就需要下载或者编译一个libpypy-c.so。
下载http://projects.unbit.it/downloads/pypy/libpypy-c-x86_64.so
编译就需要下载pypy源码tarball了,本人用的pypy-2.3.1,
./rpython/bin/rpython -Ojit --shared --gcrootfinder=shadowstack pypy/goal/targetpypystandalone
本人4G内存,64位机花费了1小时多编译完成。会生成libpypy-c.so和pypy-c两个重要的文件。
既然网上提供了为何还要费劲编译,这就是问题所在,由于用apt-get安装的pypy版本与从网上下载先来的
libpypy-c-x86_64.so可能版本不同导致出现下面的错误:
debug: OperationError:
debug: operror-type: AssertionError
debug: operror-value:
所以如果没有出错最好,出错了还是编译一个吧,把libpypy-c.so放到动态链接路的默认路径下或者
LD_LIBRARY_PATH环境变量里。把pypy-c利用virtualenv -p /path/to/pypy-c virtualnew创建虚拟环境,
再同上面的方法安装flask或者django、uwsgi.
Wed Jun 25 00:41:26 2014 - uwsgi socket 0 bound to TCP address 0.0.0.0:6001 fd 3 Initialized PyPy with Python 2.7.6 (32f35069a16d819b58c1b6efb17c44e3e53397b2, Jun 23 2014, 15:54:22) [PyPy 2.3.1 with GCC 4.8.2] PyPy Home: /path/to/virtualnew Wed Jun 25 00:41:27 2014 - your server socket listen backlog is limited to 20 connections Wed Jun 25 00:41:27 2014 - your mercy for graceful operations on workers is 60 seconds Wed Jun 25 00:41:27 2014 - mapped 291072 bytes (284 KB) for 3 cores Wed Jun 25 00:41:27 2014 - *** Operational MODE: preforking *** Wed Jun 25 00:41:27 2014 - *** no app loaded. going in full dynamic mode *** Wed Jun 25 00:41:27 2014 - *** uWSGI is running in multiple interpreter mode *** Wed Jun 25 00:41:27 2014 - spawned uWSGI master process (pid: 1566) Wed Jun 25 00:41:27 2014 - spawned uWSGI worker 1 (pid: 1569, cores: 1) Wed Jun 25 00:41:27 2014 - spawned uWSGI worker 2 (pid: 1570, cores: 1) Wed Jun 25 00:41:27 2014 - spawned uWSGI worker 3 (pid: 1571, cores: 1)
pypy终于可以好好用用了,看上面红色两行可知pypy 2.3.1对应python 2.7.6。本人对pypy有
着相当的好感,它不仅在运行flask、django等项目上比python要快(之前的文章本人就介绍过pypy与
python计算斐波那契数列时间的比较,差了可谓一条街的距离),并且它是python开发的(rpython)。
就像java、go等许多高级语言一样,最初虽然是c开发的,但最后都是回到了自己解释自己。
虽然pypy现在还有诸多问题,虽然官方python依旧是c开发的 ,但是本人希望pypy更好的发展。
只为您的快、只为您是python写的python解释器。