一:进程池
进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,
如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。
进程池中有两个方法:
- apply
- apply_async
进程池 apply是串行;apply_async是并行
pool必须先要close在join,进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭
二:代码示例
有join代码和结果
# -*- coding:utf-8 -*- __author__ = 'shisanjun' from multiprocessing import Process,Pool import time def Foo(i): time.sleep(2) return i+100 def Bar(arg): print("-->exec done",arg) if __name__=="__main__":#main如果有main表示手动运行,执行main下面代码,如果是导入模块就不执行 pool=Pool(5) for i in range(10): pool.apply_async(func=Foo,args=(i,),callback=Bar) #Foo执行完的结果会当作参数给Bar #callback是主进程调用,比如数据库连接,如果在子进程每次都生成连接就会占用资源,在主进程只要生成一次 print("end") pool.close() pool.join()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭 """ end -->exec done 100 -->exec done 101 -->exec done 102 -->exec done 103 -->exec done 104 -->exec done 105 -->exec done 106 -->exec done 107 -->exec done 108 -->exec done 109 """
没有join代码,主进程执行完直接退出了,所以子进行没有结果输出
# -*- coding:utf-8 -*- __author__ = 'shisanjun' from multiprocessing import Process,Pool import time def Foo(i): time.sleep(2) return i+100 def Bar(arg): print("-->exec done",arg) if __name__=="__main__":#main如果有main表示手动运行,执行main下面代码,如果是导入模块就不执行 pool=Pool(5) for i in range(10): pool.apply_async(func=Foo,args=(i,),callback=Bar) #Foo执行完的结果会当作参数给Bar #callback是主进程调用,比如数据库连接,如果在子进程每次都生成连接就会占用资源,在主进程只要生成一次 print("end") pool.close() #pool.join()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭