[python]gevent学习(1)


之前测试了stackless,感觉不太好.

不过python作为最火的脚本语言,还是吸引力难挡.

python的协程方案,除了stackless,还有greenlet,

相应的事件框架也有gevent ,eventlet等.

先看gevent.

0.x版的gevent是基于libevent的,安装比较简单.还支持windows,先看这个.

1.x版的 gevent改成了libev的, 还需要安转cython,而且没有windows版的...

先来经典的击鼓传花

 

 

#!/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)

两者的差距在可以接受的范围.

 

 

#[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]# 	


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值