2014年02月19日 星期三 09:42
注:这是我多年前写的一个老帖子,当时想使用Python实现一个MySQL多线程复制的中间件,但Python中的GIL让我不得不放弃多线程而改用多进程。后来研究了一下Jython,多线程效果很好,如获至宝,但Jython当时的版本是2.5.x,并且一直停滞不前。今天去官网看了一眼,发现Jython的2.7.x已经是Beta状态了,值得期待。
原文发布于网易博客:
http://xmgu2008.blog.163.com/blog/static/1391223802011619111132795/
原文:
Jython是建立在Java VM基础上的Python语言的一个实现,比起CPython,最大的改进莫过于其实现了真正的多线程,摒弃了CPython中的GIL,能够充分发挥多CPU的优势。我做了一个简单的测试,测试环境的CPU数量为8。
测试程序源码:
[root@leto101 ~]# cat parallel_calc.py
import threading
import signal
import time
stop=0
def handler(signum,frame):
print "got signal :",signum
global stop
stop=1
def calc():
print "start thread..."
for i in xrange(10000000):
global stop
if stop == 1:
break
s=100*100*100
t={}
signal.signal(signal.SIGINT,handler)
signal.signal(signal.SIGTERM,handler)
for i in range(10):
t[i]=threading.Thread(target=calc)
t[i].start()
for i in range(10):
print "joining ",i
t[i].join()
运行jython解释器:
[root@leto101 ~]# time /opt/jython/jython parallel_calc.py
start thread...
start thread...
...
joining 8
joining 9
real 0m5.297s
user 0m23.347s
sys 0m0.332s
运行python解释器:
[root@leto101 ~]# time python parallel_calc.py
start thread...
start thread...
...
joining 8
joining 9
real 0m30.835s
user 0m25.286s
sys 0m13.439s
可以看出,user的时间基本差不多,说明两者在执行效率上差别不大,但real时间相差将近6倍,说明Jython确实充分利用的多个CPU,非常具有优势。
另外,CPython在处理信号的过程中有一些问题,上面这个程序,如果使用CPython解释器,在运行过程中按CTRL+C,是不能够正常退出的,并且CPU飙升到600%以上,但在Jython解释器中,却可以正常中断并退出,我还没研究明白。
Zeuux © 2024
京ICP备05028076号