以前測試了stackless,感受不太好. 不過python做爲最火的腳本語言,仍是吸引力難擋. python的協程方案,除了stackless,還有greenlet, 相應的事件框架也有gevent ,eventlet等. 先看gevent. 0.x版的gevent是基於libevent的,安裝比較簡單.還支持windows,先看這個. 1.x版的 gevent改爲了libev的, 還須要安轉cython,並且沒有windows版的... 先來經典的擊鼓傳花 [python] view plain copy #!/bin/env python # -*- coding: utf-8 -*- #gevent版的擊鼓傳花(erlang和stackless的經典例子) #由n個節點組成一個環狀網絡,在上面傳送共m個消息。 #將每一個消息(共m個),逐個發送給1號節點。 #第1到n-1號節點在接收到消息後,都轉發給下一號節點。 #第n號節點每次收到消息後,再也不繼續轉發。 #當m個消息都從1號逐個到達第n號節點時,認爲所有處理結束。 #每次執行時設定n=300,m=10000 import gevent from gevent.queue import Queue import sys if len(sys.argv) < 2: n=300 m=10000 else: n=int(sys.argv[1]) m=int(sys.argv[2]) print('start with n=%s,m=%s' % (n,m)) #建立隊列 ch=range(1,n) for i in xrange(1,n): ch[i-1] = Queue() #結果隊列 #result= Queue() #定義節點(協程) def node(i): while True: msg = ch[i-1].get() print('node %s got msg %s' % (i, msg)) if i==n-1: print ('msg %s reach last node %s' % (msg,i)); else: ch[i].put_nowait(msg) if msg>=m-1: print('final msg %s got,node %s quit' % (msg,i)); break #初始化消息 for k in xrange(1,m): print('send %s to node %s' % (k,1)) ch[0].put_nowait(k) #建立節點(協程) nodes=range(1,n) for j in xrange(1,n): nodes[j-1] = gevent.spawn(node, j) gevent.joinall(nodes) #[root@search2 test]# time ./tgering.py 3000 100 #real 0m0.803s #user 0m0.785s #sys 0m0.017s #[root@search2 test]# time ./tgering.py 10000 100 #real 0m2.499s #user 0m2.469s #sys 0m0.028s #[root@search2 test]# time ./tgering.py 100 10000 #real 0m2.201s #user 0m2.190s #sys 0m0.009s #[root@search2 test]# time ./tgering.py 300 10000 #real 0m7.082s #user 0m7.067s #sys 0m0.009s 這個性能仍是很可觀的. 公平起見,在相同環境測試了一下perl的coro性能(基於EV) 二者的差距在能夠接受的範圍. [python] view plain copy #[root@search2 perl]# time ./tring.pl 3000 100 #real 0m1.148s #user 0m1.128s #sys 0m0.016s #[root@search2 perl]# time ./tring.pl 10000 100 #real 0m3.865s #user 0m3.836s #sys 0m0.025s #[root@search2 perl]# time ./tring.pl 300 10000 #real 0m10.564s #user 0m10.529s #sys 0m0.024s #[root@search2 perl]#
參考資料:node
http://blog.csdn.net/laputa73/article/details/12190317python