进程池作用:同一时间有多个进程在CPU中运行。
进程池实现步骤:(1)定义一个进程池对象:pool=Pool(processes=n)#允许进程池同时放入n个进程
(2)设置多线程:for i in range(n)
(3)进程池实现 pool.apply()同步串行; pool.apply_async()异步并行
(4)关闭进程池 pool.close()
(5)等待进程池执行完毕 pool.join()
实例:
from multiprocessing import Pool import time,os def Foo(i): time.sleep(1) print("in process:",os.getpid()) return i+10 def Bar(arg): print("--->work done:",arg,os.getpid()) if __name__=="__main__": pool=Pool(processes=3) #允许进程池同时放入3个进程 print("主进程:",os.getpid()) for i in range(10): pool.apply_async(func=Foo,args=(i,),callback=Bar) #异步并行,先调Foo,然后在回调Bar #pool.apply(func=Foo,args=(i,)) #串行 #pool.apply_async(func=Foo, args=(i,)) #并行 print("end") pool.close() #若不关闭,会有断言错误AssertionError pool.join() #若不join(),程序会直接关闭,不执行子进程;且必须关闭在前,join()在后
最后一句:pool.join()可能会有疑问,为什么只等待最后一次的执行完毕了呢?异步回调执行和同步串行可以理解,那异步并行呢?难道不需要等待第二次和第三次的执行完毕吗?
问题2:for i in range(10) 循环10个线程,一个池中只能放3个,为什么每次循环的3个进程id都与上次相同?在第一次将3个进程放入进程池中难道不应该占据这个id了吗?