鱼C论坛

 找回密码
 立即注册
查看: 3235|回复: 0

[技术交流] windows下多进程加协程并发模式

[复制链接]
发表于 2016-5-1 00:23:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
   好久没更新了。正好最近要整理一下最近这段时间做过的项目以及学习python的一些心得。如标题所示,今天就来说说windows下多进程加协程并发模式。其实网上还是蛮多在linux下的多进程加协程并发模式,本身linux对python的支持更好吧。但是由于本人的开发环境是windows的,而且网上关于这方面的资料还是少了一点,不过经过一番折腾,也算是弄出来了。废话不多说,先贴代码吧:
  1. # coding=utf-8
  2. # windows下多进程加协程并发模式
  3. # 打入gevent的monkey补丁
  4. from gevent import monkey
  5. monkey.patch_all()
  6. # 导入协程池
  7. from gevent.pool import Pool
  8. import urllib2
  9. # 导入多进程模块
  10. import multiprocessing
  11. import time
  12. # 定义一个爬取微博网页的方法
  13. def html(url=u'http://weibo.com/'):
  14.     # 用上多进程的锁机制,用于防止连续打印
  15.     lock = multiprocessing.Lock()
  16.     try:
  17.         h = urllib2.urlopen(url).read()
  18.     except:
  19.         lock.acquire()
  20.         print u'连接错误'
  21.         lock.release()
  22.     else:
  23.         lock.acquire()
  24.         print u'done'
  25.         lock.release()

  26. # 定义一个协程并发方法(用的是gevent的协程池)
  27. def a(num):
  28.     pool = Pool(100)
  29.     # 协程池的map方法可以让你自定义并发次数,这里可以自定义爬取微博网页的并发次数,第一个参数是要执行的函数
  30.     # 第二个参数可以理解成需要并发参数的次数
  31.     pool.map(html, [u'http://weibo.com/' for i in xrange(num)])
  32.     pool.kill()
  33.     pool.join()

  34. # 这个是比较关键的一个方法,就是协程加多进程的并发模式
  35. def b(num):
  36.     t = []
  37.     # 建立10个进程来并行协程即方法a
  38.     for i in xrange(10):
  39.         p = multiprocessing.Process(target=a, args=(num,))
  40.         p.start()
  41.         t.append(p)
  42.     for each in t:
  43.         each.join()

  44. # 对比多进程加协程与纯粹协程的各自的并发状态
  45. if __name__ == '__main__':
  46.     print u'方法b开始计时:'
  47.     start = time.time()
  48.     b(10)
  49.     print u'方法b总共花费%f秒' % (time.time() - start)
  50.     print u'方法a开始计时:'
  51.     start = time.time()
  52.     a(100)
  53.     print u'方法a总共花费%f秒' % (time.time() - start)
复制代码

上面的代码注释的挺清楚的了,下面贴一下执行的结果吧:
820399-20160418005359598-1284575562 (1).png
820399-20160418005651348-581028035.png

从上面的结果可以看到,执行协程加多进程的方法b时,多核cpu是可以被充分利用的,这是单纯使用协程方式无法做到的,这也是多进程的一大好处吧。由于我这里实验的是100次并发,所以其实就效果来说还不是很明显,但是当你要瞬时并发一千个或者一万个的时候,差距就可以显现出来了,显然,协程加多进程的方式是更加牛叉的,这种模式充分把两者的优点结合起来了。

  这里如果读者对python的协程模块与多进程模块不熟悉的话,还是自行百度一下吧。毕竟自己真正理解了才是自己的东西啊。其实我也还是个python菜鸟,如果上面的代码有啥问题或者更好的建议的话,还希望大神们不吝赐教呀!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-23 17:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表