在python中启动进程是非常耗资源的,有了进程池就可以限制同一时刻运行的进程数,避免程序崩溃。
Pool可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。
进程池使用如下:
from multiprocessing import Process, Pool,freeze_support import time import os def Foo(i): time.sleep(2) print("in process",os.getpid()) return i + 100 def Bar(arg): print('-->exec done:', arg,os.getpid()) if __name__ == '__main__': #freeze_support() pool = Pool(processes=3) #允许进程池同时放入3个进程 print("主进程",os.getpid()) for i in range(10): pool.apply_async(func=Foo, args=(i,), callback=Bar) #callback=回调 进程执行完毕后由父进程调用 #pool.apply(func=Foo, args=(i,)) #串行 #pool.apply_async(func=Foo, args=(i,)) #并行 print('end') pool.close() pool.join() #进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。.join()
运行结果:
主进程 12376
end
in process 8664
-->exec done: 100 12376
in process 13008
-->exec done: 101 12376
in process 11812
-->exec done: 102 12376
in process 8664
-->exec done: 103 12376
in process 13008
-->exec done: 104 12376
in process 11812
-->exec done: 105 12376
in process 8664
-->exec done: 106 12376
in process 13008
-->exec done: 107 12376
in process 11812
-->exec done: 108 12376
in process 8664
-->exec done: 109 12376
利用multiprocessing下的Pool可以很方便的同时自动处理几百或者上千个并行操作,脚本的复杂性也大大降低。