第二十六篇、进程池

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

进程池中有两个方法:

  • apply
  • apply_async
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from multiprocessing import Pool
import time
def f1(a):
    time.sleep(2)
    print(a)
    return 1000
def f2(args):
    print(args)

if __name__ == '__main__':
    pool = Pool(5)
    for i in range(10):
        #pool.apply_async(func=f1,args=(1,),callback=f2)
        pool.apply(func=f1,args=(1,))
        print(111)
    pool.close()#代表所有任务执行之后再执行join方法终止
    #pool.terminate()
    pool.join()#进程池的join方法,让主进程等待子进程执行完毕之后再结束

p = pool(5)

p.apply如下方法:

1、 每一个任务是排队进行;

2、每一个进程里面都有一个join方法:进程.join(),要不然上面代码不会一个进程一个进程的往下执行

p.apply_async如下方法:

 1、每一个任务都并发进行,(先在进程池里面创建所有进程,然后并发执行,异步的)

2、可以设置回调函数;callback=Bar  回调函数,就是把func=f1的函数的返回值 放入到Bar函数参数里面继续往下执行

3、进程没有join方法,主进程没有等子进程,进程的deamon = True,用这个方法必须要用join方法

由于p.apply_async方法,要用到join方法,在这之前要用到close或者terminate方法原因如下:

查看join方法:

从join源码中可以知道,要执行join方法必须首先执行close或者terminate方法

原文地址:https://www.cnblogs.com/pyrene/p/6490256.html