标签:
说道Python和多线程,很容易想到GIL,GIL意味着只要是用Python做的多线程程序,就无法利用多个CPU。
经过一些失败的尝试后,我也一度认为GIL是无解的。我们甚至把注意力转向了IronPython等无锁Python,但是实际上那样问题可能更多,比如我们不熟悉mono,mono也没达到完全成熟的程度。
直到skynet的QQ群里一位朋友介绍了另一种加载so的方式,事情才有了180度的变化。
方法如下:
1、编译Python源码,编译时加上参数--enable-shared,编译成so动态链接库。
2、找到so,拷贝N份,分别命名为 libpython_1.so, libpython_2.so, ... 等等
3、用C语言,使用linux下的ldfcn库,动态加载这些so库,ldfcn可以保证同名全局变量不冲突。
(C语言源码,待整理)
(编译注意事项,待整理)
(设置环境变量,待整理)
用简单Py脚本测试,会发现脚本的运行确实是独立的。但是如果用了 import time,则会造成段错误。
原因是用这种方法,以后import的各种python的库,如果是C语言扩展的,那么就会因为重复而冲突。
解决方法是在编译Python时,加入--enable-time,把time库和python库编译到一起,就能解决这个问题。
(另一种备选方案是找到time源码,在库名后加上数字,也编出N份time_1, time_2... 等等,在脚本里也分别import不同的time库,即可。)
由于我们的Python环境禁止在脚本内启动多线程,所以可以加入编译参数--without-threads,这样还能稍微提高一点运行效率。
版权声明:本文为博主原创文章,未经博主允许不得转载。
Meme游戏服务器开发日记(二)绕过GIL启动多线程Python环境
标签:
原文地址:http://blog.csdn.net/mayao11/article/details/47783469