进程池:用于确定同一时间有多少个进程在CPU上运行。本实例创建10个进程,每次就启用5个,就是5个5个的打印。
进程池用法:
1. 创建 mypool = Pool(5)
2. 调用 mypool.apply_async(func=Foo, args=(i,), callback=Bar)
3. 关闭 mypool.close()
4. 阻塞等待 mypool.join() 一定要在最后这加上,否则就不执行了,我也不知道为什么。
在 windows下启动多进程,一定要加上freeze_support() MAC linux不需要。
from multiprocessing import Process, Pool,freeze_support
import time
import os
def Foo(i):
time.sleep(2)
print("in process foo",os.getpid())
return i + 100
#此回调函数用于数据库备份场景 父进程里直接写数据库
# 不需要每个子进程都连一次数据库
def Bar(arg):
print("-->exec done:", arg)
def mypool():
freeze_support() # windows启动时必备 如果是直接调用则执行,如果是作为模块被调用,则不执行
mypool = Pool(5) #1.创建进程池 允许同时放入5个进程
for i in range(10):
mypool.apply_async(func=Foo, args=(i,), callback=Bar) #2.应用到进程里 callback 执行完foo 后调用Bar
# mypool.apply(func=Foo, args=(i,))
#mypool.apply_async(func=Foo, args=(i,))
print('end')
mypool.close() #先close() 后join()
mypool.join() # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
#主程序的入口 手动时会执行,模块导入时不会执行
if __name__ == '__main__':
mypool()