Python论坛  - 讨论区

标题:Python与Jython的多线程

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哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号