zoukankan      html  css  js  c++  java
  • windows下多进程加协程并发模式

    好久没更新博客了。正好最近要整理一下最近这段时间做过的项目以及学习python的一些心得。如标题所示,今天就来说说windows下多进程加协程并发模式。其实网上还是蛮多在linux下的多进程加协程并发模式,本身linux对python的支持更好吧。但是由于本人的开发环境是windows的,而且网上关于这方面的资料还是少了一点,不过经过一番折腾,也算是弄出来了。废话不多说,先贴代码吧:

    复制代码
    # coding=utf-8
    # windows下多进程加协程并发模式
    # 打入gevent的monkey补丁
    from gevent import monkey
    monkey.patch_all()
    # 导入协程池
    from gevent.pool import Pool
    import urllib2
    # 导入多进程模块
    import multiprocessing
    import time
    # 定义一个爬取微博网页的方法
    def html(url=u'http://weibo.com/'):
        # 用上多进程的锁机制,用于防止连续打印
        lock = multiprocessing.Lock()
        try:
            h = urllib2.urlopen(url).read()
        except:
            lock.acquire()
            print u'连接错误'
            lock.release()
        else:
            lock.acquire()
            print u'done'
            lock.release()
    
    # 定义一个协程并发方法(用的是gevent的协程池)
    def a(num):
        pool = Pool(100)
        # 协程池的map方法可以让你自定义并发次数,这里可以自定义爬取微博网页的并发次数,第一个参数是要执行的函数
        # 第二个参数可以理解成需要并发参数的次数
        pool.map(html, [u'http://weibo.com/' for i in xrange(num)])
        pool.kill()
        pool.join()
    
    # 这个是比较关键的一个方法,就是协程加多进程的并发模式
    def b(num):
        t = []
        # 建立10个进程来并行协程即方法a
        for i in xrange(10):
            p = multiprocessing.Process(target=a, args=(num,))
            p.start()
            t.append(p)
        for each in t:
            each.join()
    
    # 对比多进程加协程与纯粹协程的各自的并发状态
    if __name__ == '__main__':
        print u'方法b开始计时:'
        start = time.time()
        b(10)
        print u'方法b总共花费%f秒' % (time.time() - start)
        print u'方法a开始计时:'
        start = time.time()
        a(100)
        print u'方法a总共花费%f秒' % (time.time() - start)
    复制代码

    上面的代码注释的挺清楚的了,下面贴一下执行的结果吧:

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

      这里如果读者对python的协程模块与多进程模块不熟悉的话,还是自行百度一下吧。毕竟自己真正理解了才是自己的东西啊。其实我也还是个python菜鸟,如果上面的代码有啥问题或者更好的建议的话,还希望大神们不吝赐教呀!

  • 相关阅读:
    json数据读取后自动进行模板生成
    json数据排序
    fastjson json数据处理
    xml数据转Json
    jackson-dataformat-xml xml转json
    jar工具打包
    工具操作
    IBM MQ
    RabbitMq
    Excel4J
  • 原文地址:https://www.cnblogs.com/ExMan/p/10165754.html
Copyright © 2011-2022 走看看