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

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

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

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

先看gevent.

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

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

先来经典的击鼓传花

[python] view plain copy
#!/bin/env python
# -*- coding: utf- -*-
#gevent版的击鼓传花(erlang和stackless的经典例子)
#由n个节点组成一个环状网络,在上面传送共m个消息。
#将每个消息(共m个),逐个发送给1号节点。
#第1到n-1号节点在接收到消息后,都转发给下一号节点。
#第n号节点每次收到消息后,不再继续转发。
#当m个消息都从1号逐个到达第n号节点时,认为全部处理结束。
#每次执行时设定n=,m= import gevent
from gevent.queue import Queue
import sys if len(sys.argv) < :
n=
m=
else:
n=int(sys.argv[])
m=int(sys.argv[]) print('start with n=%s,m=%s' % (n,m)) #创建队列
ch=range(,n)
for i in xrange(,n):
ch[i-] = Queue() #结果队列
#result= Queue() #定义节点(协程)
def node(i):
while True:
msg = ch[i-].get()
print('node %s got msg %s' % (i, msg))
if i==n-:
print ('msg %s reach last node %s' % (msg,i));
else:
ch[i].put_nowait(msg)
if msg>=m-:
print('final msg %s got,node %s quit' % (msg,i));
break #初始化消息
for k in xrange(,m):
print('send %s to node %s' % (k,))
ch[].put_nowait(k) #创建节点(协程)
nodes=range(,n)
for j in xrange(,n):
nodes[j-] = gevent.spawn(node, j) gevent.joinall(nodes) #[root@search2 test]# time ./tgering.py
#real 0m0.803s
#user 0m0.785s
#sys 0m0.017s
#[root@search2 test]# time ./tgering.py
#real 0m2.499s
#user 0m2.469s
#sys 0m0.028s
#[root@search2 test]# time ./tgering.py
#real 0m2.201s
#user 0m2.190s
#sys 0m0.009s
#[root@search2 test]# time ./tgering.py
#real 0m7.082s
#user 0m7.067s
#sys 0m0.009s 这个性能还是很可观的. 公平起见,在相同环境测试了一下perl的coro性能(基于EV) 两者的差距在可以接受的范围. [python] view plain copy
#[root@search2 perl]# time ./tring.pl
#real 0m1.148s
#user 0m1.128s
#sys 0m0.016s
#[root@search2 perl]# time ./tring.pl
#real 0m3.865s
#user 0m3.836s
#sys 0m0.025s
#[root@search2 perl]# time ./tring.pl
#real 0m10.564s
#user 0m10.529s
#sys 0m0.024s
#[root@search2 perl]#

参考资料:

http://blog.csdn.net/laputa73/article/details/12190317

【python】gevent学习的更多相关文章

  1. Python gevent学习笔记

    gevent是Python的一个用于网络IO的函数库,其中应用到了 coroutine(协同程序) 的思想.首先来了解下目前网络框架的几种基本的网络I/O模型: 阻塞式单线程:这是最基本的I/O模型, ...

  2. Python gevent学习笔记-2

    在上一篇里面介绍了gevent的最主要的功能,先来来了解一下gevent里面一些更加高级的功能. 事件 事件是一种可以让greenlet进行异步通信的手段. ? 1 2 3 4 5 6 7 8 9 1 ...

  3. python 协程库gevent学习--gevent数据结构及实战(四)

    一不留神已经到第四部分了,这一部分继续总结数据结构和常用的gevent类,废话不多说继续. 1.Timeout错误类 晚上在调试调用第三方接口的时候,发现有些接口耗时非常多,觉得应该有个超时接口来限制 ...

  4. python 协程库gevent学习--gevent数据结构及实战(三)

    gevent学习系列第三章,前面两章分析了大量常用几个函数的源码以及实现原理.这一章重点偏向实战了,按照官方给出的gevent学习指南,我将依次分析官方给出的7个数据结构.以及给出几个相应使用他们的例 ...

  5. python高级学习目录

    1. Linux介绍.命令1.1. 操作系统(科普章节) 1.2. 操作系统的发展史(科普章节) 1.3. 文件和目录 1.4. Ubuntu 图形界面入门 1.5. Linux 命令的基本使用 1. ...

  6. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  7. 60分钟Python快速学习(给发哥一个交代)

    60分钟Python快速学习 之前和同事谈到Python,每次下班后跑步都是在听他说,例如Python属于“胶水语言啦”,属于“解释型语言啦!”,是“面向对象的语言啦!”,另外没有数据类型,逻辑全靠空 ...

  8. python爬虫学习(1) —— 从urllib说起

    0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...

  9. python爬虫学习 —— 总目录

    开篇 作为一个C党,接触python之后学习了爬虫. 和AC算法题的快感类似,从网络上爬取各种数据也很有意思. 准备写一系列文章,整理一下学习历程,也给后来者提供一点便利. 我是目录 听说你叫爬虫 - ...

  10. Python正则表达式学习摘要及资料

    摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...

随机推荐

  1. 【U3D】播放器设置(PlayerSettings)

    播放器设置 (Player Settings) 播放器设置 (Player Settings) 用于为您要在 Unity 中编译的最终游戏定义各项(特定于平台的)参数.例如,参数中的一些值用于您打开单 ...

  2. sublimetext3-实用快捷键整理

    实用快捷键 Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所有打开文件Ctrl+Shift+ ...

  3. Docker应用系列(一)| 构建Redis哨兵集群

    本示例基于Centos 7,在阿里云的三台机器上部署redis集群,假设目前使用的账号为release,拥有sudo权限. 由于Docker官方镜像下载较慢,可以开启阿里云的Docker镜像下载加速器 ...

  4. python的进阶--爬虫小试

    代理之说 [ python实现代理服务功能实例 ]  --  https://www.jb51.net/article/43266.htm [检测代理是否有效] -- https://blog.csd ...

  5. king's trouble II SCU - 4488

    Time Limit: 1000 MS Memory Limit: 131072 K Description Long time ago, a king occupied a vast territo ...

  6. 【BZOJ 3443】 3443: 装备合成 (离线+线段树)

    3443: 装备合成 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 63  Solved: 31 Description [背景]     lll69 ...

  7. NOI2005 维护数列(splay)

    学了半天平衡树,选择了一道题来写一写,发现题目是裸的splay模板,但是还是写不好,这个的精髓之处在于在数列的某一个位置加入一个数列,类似于treap里面的merge,然后还学到了题解里面的的回收空间 ...

  8. Android背后的设计思想——功能共享机制

    Android的系统设计,与别的智能手机操作系统有很大区别,甚至在以往的任何操作系统里,很难找到像Android这样进行全面地系统级创新的操作系统.从创新层面上来说,Android编程上的思想和支持这 ...

  9. 【9.2校内测试】【开学祭】【exgcd】【树规(背包】【模拟】

    比较裸的$exgcd$的应用? $exgcd$可以算出在$x$和$y$分别是最小正整数时的解.注意在这里因为有$a(x+\frac{b}{d})+b(y-\frac{a}{d})=c$,$d=gcd( ...

  10. bzoj 1911: [Apio2010]特别行动队 -- 斜率优化

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Description Input Output Sample Input 4 ...