并发编程语言,并发编程基础

  并发编程语言,并发编程基础

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: