之前测试了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. C++的一道变态题

    题目大概是这样的:有两个数组a[N],b[N],求构造 b[i]=a[0]*a[1]*a[2]*...a[N-1]/a[i], 要求: .不能使用除法. .空间复杂度O(1),时间复杂度O(n). . ...

  2. 《java虚拟机》----java内存区域与内存溢出异常

    No1: java虚拟机所管理的内存将会包括以下几个运行时数据区域 1.方法区 2.虚拟机栈 3.本地方法栈 4.堆 5.程序计数器 No2: 程序计数器: 程序计数器(Program Counter ...

  3. braft初探

    接上一篇<brpc初探>. 什么是RAFT 看内部一个开源项目的时候,一开始我以为他们自己实现了raft协议.但是看了代码之后,发现用的是braft.因为在我们自己bg里一直在提paxos ...

  4. 使用抽象bean

    定义抽象类Abstract=“true”抽象bean不能实例化,一个类可以创建多个bean. 抽象bean的配置和一般bean的配置基本一样只是在增加了Abstract=“true”抽象bean是一个 ...

  5. 【Python】闭包Closure

    原来这就是闭包啊... 还是上次面试,被问只不知掉js里面的闭包 闭包,没听过啊...什么是闭包 回来查了下,原来这货叫闭包啊...... —————————————————————————————— ...

  6. Python开发基础-Day30多线程锁机制

    GIL(全局解释器锁) GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念,是为了实现不同线程对共享资源访问的互斥,才引入了GIL 在Cpython解释器 ...

  7. 山东省第四届省赛 E-Mountain Subsequences

    Description Coco is a beautiful ACMer girl living in a very beautiful mountain. There are many trees ...

  8. 51nod 1035 最长的循环节 数学

    1035 最长的循环节 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1035 Description 正整 ...

  9. paip.手机时间设置不能修改灰色禁用 解决大法

    paip.手机时间设置不能修改灰色禁用  解决大法 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net ...

  10. High-current supply uses standard three-terminal regulator

    Voltage-regulator design for high output currents can be a critical and difficult task. Although vol ...