并发编程语言,并发编程基础
http://guangfeng.blogspot.com/2010/05/eventlet.html
并发编程工具Eventlet
Eventlet是Secondlife开源的一个高度可扩展的Python网络编程库。
根据官方介绍,大致特点如下:
非阻塞I/O模型协同例程使开发人员可以采用阻塞开发风格,但它可以实现非阻塞I/O效果的隐式事件调度,从而使Eventlet可以在Python解释器或应用程序的某个部分中使用。
至于协程,大致可以理解为允许子程序多次暂停和恢复,是实现多任务的有效手段。详情见此。
在Python的世界里,实现非阻塞I/O的产品不在少数,比如内置的Asyncore和大名鼎鼎的Twisted。相比之下,Eventlet更容易上手和使用。
例如
导入事件小程序
pool=eventlet。绿色池()
while True: pool.spawn(func,args)
上面的代码几乎是使用eventlet的范例:
使用GreenPool实现协调,保证并行性;Spawn用于调用相应的函数来完成具体的业务。各func开关,实行“你跑一会,我跑一会”。切换时,必须指定切换的时间和位置。当出现拥塞时,会显式切换到另一个未阻塞的代码段执行,然后手动切换回原代码段继续处理。
Eventlet内置提供了基于上述原理的数据库连接池,目前只支持MySQL和PostgreSQL。为了测试它的性能,我参考了gashero的这篇文章,简化了测试方案。
测试对象为mysqldb(MySQL驱动的Python包)、eventlet.db _ pool和dbutils。
测试代码如下:
导入时间
随机导入
导入MySQLdb
将eventlet.db_pool作为db_pool导入
来自DBUtils。导入池
conn _ kwargs={ host : 192 . 168 . 8 . 84 , user:root , passwd : , db:logs}
SQL= SELECT * FROM test WHERE id=% d
pooled=db_pool。连接池(MySQLdb,**conn_kwargs)
pooldb=PooledDB(MySQLdb,**conn_kwargs)
定义查询(连接):
cur=conn.cursor()
cur . execute(SQL %(random . randint(1,1000)))
data=cur.fetchall()
返回电流
def print_now():
print time.strftime(%H:%M:%S )
返回
定义测试1(次数):
立即打印()
对于范围内的I(0,次):
conn=mysqldb . connect(* * conn _ kwargs)
r=查询(连接)
关闭()
conn.close()
立即打印()
返回
定义测试2(次数):
立即打印()
对于范围内的I(0,次):
conn=pooled.get()
尝试:
查询(连接)
最后:
汇集输入(连接)
立即打印()
返回
定义测试3(次):
立即打印()
对于范围内的I(0,次):
conn=pooldb.connection()
r=查询(连接)
关闭()
conn.close()
立即打印()
返回
然后进入Python解释器交互环境。
Python -i db-pool-test.py
test1(10000) //MySQLdb
16:04:34
16:11:25
test2(10000)//事件
16:12:35
16:15:22
test3(10000) //DBUtils
16:15:28
16:18:09
总体来说,与传统的MySQLdb相比,性能有了很大的提升,与DBUtils的区别并不明显。
谢成很厉害!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。