【python】gevent学习
之前测试了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学习的更多相关文章
- Python gevent学习笔记
gevent是Python的一个用于网络IO的函数库,其中应用到了 coroutine(协同程序) 的思想.首先来了解下目前网络框架的几种基本的网络I/O模型: 阻塞式单线程:这是最基本的I/O模型, ...
- Python gevent学习笔记-2
在上一篇里面介绍了gevent的最主要的功能,先来来了解一下gevent里面一些更加高级的功能. 事件 事件是一种可以让greenlet进行异步通信的手段. ? 1 2 3 4 5 6 7 8 9 1 ...
- python 协程库gevent学习--gevent数据结构及实战(四)
一不留神已经到第四部分了,这一部分继续总结数据结构和常用的gevent类,废话不多说继续. 1.Timeout错误类 晚上在调试调用第三方接口的时候,发现有些接口耗时非常多,觉得应该有个超时接口来限制 ...
- python 协程库gevent学习--gevent数据结构及实战(三)
gevent学习系列第三章,前面两章分析了大量常用几个函数的源码以及实现原理.这一章重点偏向实战了,按照官方给出的gevent学习指南,我将依次分析官方给出的7个数据结构.以及给出几个相应使用他们的例 ...
- python高级学习目录
1. Linux介绍.命令1.1. 操作系统(科普章节) 1.2. 操作系统的发展史(科普章节) 1.3. 文件和目录 1.4. Ubuntu 图形界面入门 1.5. Linux 命令的基本使用 1. ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- 60分钟Python快速学习(给发哥一个交代)
60分钟Python快速学习 之前和同事谈到Python,每次下班后跑步都是在听他说,例如Python属于“胶水语言啦”,属于“解释型语言啦!”,是“面向对象的语言啦!”,另外没有数据类型,逻辑全靠空 ...
- python爬虫学习(1) —— 从urllib说起
0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...
- python爬虫学习 —— 总目录
开篇 作为一个C党,接触python之后学习了爬虫. 和AC算法题的快感类似,从网络上爬取各种数据也很有意思. 准备写一系列文章,整理一下学习历程,也给后来者提供一点便利. 我是目录 听说你叫爬虫 - ...
- Python正则表达式学习摘要及资料
摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...
随机推荐
- vue 阻止事件冒泡
<mt-button type="danger" size="small" @click="cancelOrderInfo(this.even ...
- python 学习笔记 - Queue & Pipes,进程间通讯
上面写了Python如何创建多个进程,但是前面文章中创建的进程都是哑巴和聋子,自己顾自己执行,不会相互交流.那么如何让进程间相互说说话呢?Python为我们提供了一个函数multiprocessing ...
- 【BZOJ 3566】 3566: [SHOI2014]概率充电器 (概率树形DP)
3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电 ...
- BZOJ2938 POI2000病毒
我们不能让重复过的字串出现在无限串上(就叫这个了...) 也就是要自动机一直能匹配但就是匹配不到,那么就是在自动机上找一个环. dfs判环即可.注意是个有向图. #include<bits/st ...
- POJ 3904 JZYZOJ 1202 Sky Code 莫比乌斯反演 组合数
http://poj.org/problem?id=3904 题意:给一些数,求在这些数中找出四个数互质的方案数. 莫比乌斯反演的式子有两种形式http://blog.csdn.net/out ...
- DEDECMS最新友情链接getshell漏洞分析
先上exp: <?php //print_r($_SERVER); $referer = $_SERVER['HTTP_REFERER']; $dede_login = str_replace( ...
- [GCJ2017R3]Cooclement
题目大意: 一种数列按照如下方式变化: 新数列第i位等于原数中数字i的出现次数. 变化过程中数列长度不变. 例如数列12的变化过程为12-11-20-01-10. 现在告诉你一个数列x,请求出x可能是 ...
- USACO 2017 FEB Platinum mincross 可持久化线段树
题意 上下有两个位置分别对应的序列A.B,长度为n,两序列为n的一个排列.当Ai == Bj时,上下会连一条边.你可以选择序列A或者序列B进行旋转任意K步,如 3 4 1 5 2 旋转两步为 5 2 ...
- CentOS6永久修改主机名称
1.修改network vi /etc/sysconfig/network 修改HOSTNAME值 2.修改hosts vi /etc/hosts 修改中间的那个localhost 3.使用hostn ...
- MySQL遇到的一个卡库问题及对update的学习
近日遇到个卡库的问题,环境是MySQL5.5.12,报错信息如下 ) and was aborted. There is a chan ce that your master is inconsist ...