【python】gevent學習

以前測試了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

相關文章
相關標籤/搜索