进程池


  • 方便创建,管理进程,单独进程的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执行完才会执行res2
    res2 = 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  
  •   

      

      

41.进程池--Pool的更多相关文章

  1. [转]Python多进程并发操作中进程池Pool的应用

    Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...

  2. Python多进程并发操作中进程池Pool的应用

    Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...

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

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

  4. python 进程池pool简单使用

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

  5. Python多进程库multiprocessing中进程池Pool类的使用[转]

    from:http://blog.csdn.net/jinping_shi/article/details/52433867 Python多进程库multiprocessing中进程池Pool类的使用 ...

  6. python学习笔记——multiprocessing 多进程组件 进程池Pool

    1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...

  7. 多任务-进程之进程池Pool

    1.什么是池? 首先从字面上看,池代表着一个容器,用来承载着某些内容的容器,了解到这里,就对进程池有了一个初步的轮廓. 2.什么是进程池Pool? (1)利用现实中的事物来理解: 对于小白初学者,接触 ...

  8. Python多进程库multiprocessing创建进程以及进程池Pool类的使用

    问题起因最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似bag ...

  9. Python 之并发编程之manager与进程池pool

    一.manager 常用的数据类型:dict list 能够实现进程之间的数据共享 进程之间如果同时修改一个数据,会导致数据冲突,因为并发的特征,导致数据更新不同步. def work(dic, lo ...

随机推荐

  1. IDEA创建类似于Eclipse的source folder

    1.新建普通文件夹目录directory 2.当前Module右键Open Mudule Settings(F12) 3.选中新建的文件夹并单击上面的Sources,看到文件夹颜色变化即成功.

  2. using来定义类的别名,typedef,#define

    宏定义:其实就是替换作用 #define TRUE 1    //结尾无分号,宏名TRUE,计算机会把所有TRUE替换为1. typedef:定义类的别名 tpyedef unsigned int U ...

  3. 安裝開源BBS軟件YAF時碰到的問題

    1.下載 http://yetanotherforum.net/download.aspx 安裝說明 http://www.drreddys.com/quest/readme.htm 其實只要打開根目 ...

  4. CTS2019自闭记

    没想到吧,我竟然还有一篇游记. Day 0 上午开开心心地考完了中考英语听说考试,然后就出发去机场了. 第一次一个人坐飞机还有点小激动? 7点左右到的北京,到酒店就已经9点了,赶紧跟着hz学长学了一下 ...

  5. 数据结构实验之二叉树二:遍历二叉树 SDUT 3341

    #include <bits/stdc++.h> using namespace std; struct Tree { char data; struct Tree *right; str ...

  6. 有向网络(带权的有向图)的最短路径Dijkstra算法

    什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...

  7. 十六、程序包管理之 rpm

    c语言程序的构建过程 1.程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接--> 可执行程序 开放源码:就是程序码,文本格式的源代码,写给人类看的程序 ...

  8. open suse tumbleweed安装记录

    zypper install imagewriter cmake blender fontforge gimp digikam inkscape  kontact pitivi smplayer si ...

  9. Leetcode题目322.零钱兑换(动态规划-中等)

    题目描述: 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: c ...

  10. DELPHI10.3.1安卓照相

    DELPHI10.3.1安卓照相 解决方法: