进程池


  • 方便创建,管理进程,单独进程的Process创建,需要手动开启,维护任务函数,以及释放回收
  • 进程池不需要这么麻烦,进程提前创建好,未来在使用的时候,可以直接给与任务函数
  • 某个进程池中的任务结束了,占用的进程会自己释放刚才工作的事情,以便接收下一个
  • P = Pool(num) #创建一个包含有num个空闲进程的池子
  • p.apply() 填充任务,任务如果结束,会自动释放掉当前占用的进程
  • 创建大规模任务,Pool(100)
  • 1,创建进程池:进程池中的进程是可以复用的
    • from mutliprocessing import Pool
    • p = Pool(num)
      • num:指明当前多少空闲进程创建出来
    • p.apply(func,args,)
      • 阻塞行为
      • func:指明填充功能函数名
      • args:对应的参数
      • 阻塞行为相当于(lock)加锁的进程池工作方式,有序的,第一个执行完才会执行第二个
    • p.apply_async(func,args,)
      • 非阻塞行为,并发的,无序的
    • p.close()
      • 在整个业务结束之后,进程池要首先关闭
      • 关闭之后进程池里的旧任务会继续执行但是没有办法填充新的任务
      • 进程池关闭了就无法打开
    • p.join()
      • 进程回收,把关闭了的进程池中的每个进程join() 释放回收掉
    • p.terminate()
      • 直接关闭进程池,并且终止所欲偶进程
  • 2,进程池的工作的返回值:
    • res = p.apply(func,)

      • res就是进程池的工作结果
      • 立竿见影就可以看到结果,就因为apply填充任务是阻塞行为
    • res = p.apply_aysnc(func,)
      • 非阻塞的结果,可以立即拿到,但是不是结果,只是一个抽象虚拟的值
        • 这个值代表进程结束后的返回值
      • res.get() #使用要谨慎
        • 当前非阻塞执行的进程,有优先级先结束
        • 强制要求立即这个结果,但是会影响进程之间的并发效果
  • 3,进程池中的通信队列是特殊的
    • from multiprocessing import Manager
    • q = Manager().Queue()   #进程共享队列
    • 无法使用管道(Pipe)
  • #进程池创建
    from multiprocessing import Pool
    import sys
    def work_a():for var in range(1,5):print(var) sys.stdout.flush()
    def work_b():for var in range(5,10):print(var)sys.stdout.flush()
    def work_c():for var in range(10,15):print(var)sys.stdout.flush()
    def main():p = Pool(2) #参数:可以最多同时执行任务个数,并不是填充的最大任务个数#p.apply_async(func=work,args=(a,b),) 非阻塞行为p.apply(func=work_a)#阻塞行为p.apply(func=work_b)p.apply(func=work_c)#?: 是否是阻塞行为执行完这三个任务#阻塞的话:1个等一个,同步#非阻塞:异步p.close()p.join()
    if __name__ == '__main__':main()
    

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    

  • #获取阻塞进程池返回结果
    from multiprocessing import Pool
    import sys
    def work_a():for var in range(1,5):print(var) sys.stdout.flush()return 'a'
    def work_b():for var in range(5,10):print(var)sys.stdout.flush()return 'b'
    def work_c():for var in range(10,15):print(var)sys.stdout.flush()return 'c'
    def main():p = Pool(2) #参数:可以最多同时执行任务个数,并不是填充的最大任务个数res1 = p.apply(func=work_a) #阻塞的一个等一个,res1执行完才会执行res2res2 = p.apply(func=work_b)res3 = p.apply(func=work_c)print('res1进程返回结果:%s' % res1),print('res2进程返回结果:%s' % res2),print('res3进程返回结果:%s' % res3)p.close(),p.join()
    if __name__ == '__main__':main()
    

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    res1进程返回结果:a
    res2进程返回结果:b
    res3进程返回结果:c
    

  • #获取非阻塞进程池返回结果
    from multiprocessing import Pool
    import sys
    def work_a():for var in range(1,5):
    #       print(var) sys.stdout.flush()return 'a'
    def work_b():for var in range(5,10):
    #       print(var)sys.stdout.flush()return 'b'
    def work_c():for var in range(10,15):
    #       print(var)sys.stdout.flush()return 'c'
    def main():p = Pool(2) #参数:可以最多同时执行任务个数,并不是填充的最大任务个数res1 = p.apply_async(func=work_a) #非阻塞的会返回一个抽象的数据res2 = p.apply_async(func=work_b)res3 = p.apply_async(func=work_c)print('res1进程返回结果:%s' % res1.get()),print('res2进程返回结果:%s' % res2.get()),print('res3进程返回结果:%s' % res3.get())p.close(),p.join()
    if __name__ == '__main__':main()
    

    运行结果:

    res1进程返回结果:a
    res2进程返回结果:b
    res3进程返回结果:c
    

  • #进程池通讯--Queue
    from multiprocessing import Pool,Manager,Queue
    from time import sleep
    import sys
    def work_a(q):#生产者 放十次for var in range(10):print('生产者:',var) sys.stdout.flush()q.put(var)sleep(1)
    def work_b(q):#消费者,拿十次for var in range(10):res = q.get() #阻塞行为print('消费者:',var)sys.stdout.flush()
    def main():q = Manager().Queue() #进程共享队列p = Pool(5) #进程可以复用p.apply_async(func=work_a,args={q,q})p.apply_async(func=work_b,args={q,q})p.close()p.join()
    if __name__ == '__main__':main()
    

    运行结果:

    生产者: 0
    消费者: 0
    生产者: 1
    消费者: 1
    生产者: 2
    消费者: 2
    生产者: 3
    消费者: 3
    生产者: 4
    消费者: 4
    生产者: 5
    消费者: 5
    生产者: 6
    消费者: 6
    生产者: 7
    消费者: 7
    生产者: 8
    消费者: 8
    生产者: 9
    消费者: 9  

  •   

      

      

转载于:https://www.cnblogs.com/zhangan/p/10277730.html

41.进程池--Pool相关推荐

  1. python 进程池 freeze_support_Python 多进程并发操作中进程池Pool的实例

    在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.当被操作对象数目不大时,可以直接利用multiprocessing中的Process ...

  2. python队列线程池_实例详解:python高级编程之消息队列(Queue)与进程池(Pool)

    今天为大家带来的内容是:python高级编程之消息队列(Queue)与进程池(Pool),结合了实例的形式详细分析了Python消息队列与进程池的相关原理.使用技巧与操作注意事项!!! Queue消息 ...

  3. 27 多进程之进程池Pool

    在使用Python进行系统管理的时候,特别时同时操作多个文件目录,或者远程控制多态主机并行操作,可以节约大量的时间.当被操作对象数目不大时,可以直接利用multiprocessing中的Process ...

  4. Python 多进程的进程池pool运行时报错:ValueError: Pool not running

    本文仅供学习交流使用,如侵立删!demo下载见文末 Python 多进程的进程池pool运行时报错:ValueError: Pool not running def main(self, num):& ...

  5. python进程池调用实例方法_Python进程池Pool应用实例分析

    本文实例讲述了Python进程池Pool应用.分享给大家供大家参考,具体如下: 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百 ...

  6. python 使用进程池Pool进行并发编程

    进程池Pool 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到mu ...

  7. python 多进程 multiprocessing 进程池 pool apply_async()函数与apply()函数的用法

    apply函数主要用于传递不定参数,主进程会被阻塞到函数执行结束.也就是说只有apply里面的内容被执行完了,才会进行执行主函数的内容. 参考文章1:python进程池Pool的apply与apply ...

  8. python进程池调用实例方法_Python 多进程并发操作中进程池Pool的实例

    在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.当被操作对象数目不大时,可以直接利用multiprocessing中的Process ...

  9. python 进程池不足_python 进程池pool简单使用

    平常会经常用到多进程,可以用进程池pool来进行自动控制进程,下面介绍一下pool的简单使用. 需要主动是,在Windows上要想使用进程模块,就必须把有关进程的代码写if __name__ == ' ...

最新文章

  1. iOS纯代码工程手动快速适配
  2. flask中使用Flask-SQLALCHEMY-------一个简单的例子
  3. 《高性能Linux服务器构建实战》封面照出炉
  4. 指令系统寻址方式——指令寻址,数据寻址
  5. adb push命令传文件到手机_Android调试桥(adb)
  6. CSS媒体查询,CSS根据不同的分辨率显示不同的样式
  7. springboot nacos_springboot集成nacos
  8. 1键将 Python2 代码自动转化为 Python3
  9. Linux操作系统文件链接问题
  10. 一致性哈希(hash)算法
  11. 【FPGA】 Altera FPGA 入门篇(1)
  12. cad抛物线曲线lisp_AutoCAD上精确实现抛物线和双曲线
  13. 小程序 | 如何清除手机上小程序缓存
  14. Windows照片查看器无法显示此图片
  15. livechart 只显示 y 值_数字显示调节仪XMZ-H9-01-001A-老友网
  16. SyntaxError: Non-UTF-8 code starting with ‘\xb5‘ in file问题如何解决???求助求助!!!
  17. HTML/CSS-花样边框案例
  18. 数据链路层 随机接入-CSMA/CA协议
  19. 什么是无监督、监督、半监督学习
  20. 运维自动化之---ansilbe运维自动化和ansible架构介绍(1)

热门文章

  1. linux mysql2013_linux下MySQL安装
  2. class 第一个元素_selenium之元素定位方式
  3. 厉害了!牛顿法深度学习优化器,效果比肩SGD和Adam
  4. 收藏 | 12 种 NumpyPandas 高效技巧
  5. 阿里达摩院提出新型优化方法,一行代码即可替换现有优化器
  6. c语言单链表超市出库,c语言-单链表(二)
  7. java中catalina.out_catalina.out 和 catalina.log 的区别和用途
  8. 东财mysql数据库系统及应用_2020秋东财《MySQL数据库系统及应用》单元作业一
  9. Spring Cloud 未来发展方向
  10. linux csh错误,运行lampp时报错,错误信息如下,求解决方案