注意:进程池中的进程如果发生异常时,主进程中并不会得到异常提示。
如果进程池中的进程要使用队列(Queue)实现进程间通信,必须使用queue = multiprocessing.Manager().Queue() 的方式创建队列(需要先导入multiprocessing模块)。
demo.py(进程池):
# -*- coding:utf-8 -*-
from multiprocessing import Pool
import os, time, random
def worker(msg):
t_start = time.time()
print("%s开始执行,进程号为%d" % (msg,os.getpid()))
# random.random()随机生成0~1之间的浮点数
time.sleep(random.random()*2)
t_stop = time.time()
print(msg,"执行完毕,耗时%0.2f" % (t_stop-t_start))
po = Pool(3) # 定义一个进程池,最大进程数3
# 向进程池中循环添加10个任务
for i in range(0,10):
# Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
# 每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker,(i,)) # 向进程池中添加进程任务
print("----start----")
po.close() # 关闭进程池,关闭后po不再接收新的任务请求
po.join() # 等待po进程池中所有子进程执行完成,必须放在close语句之后 (主进程结束后,进程池就会结束,进程池中的任务也会结束。 所以在结束主进程之前,先等待进程池中的任务执行完成)
print("-----end-----")