第二十六篇、进程池
进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。
进程池中有两个方法:
- 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方法