进程池:
创建进程池:pool = multipercessing,Pool(进程的最大数量)
添加任务:
pool.apply()是阻塞任务方式,会等待添加的任务执行完毕,才会继续向下执行
apply_asybnc() 是非阻塞的任务添加方式,只管添加,不等任务几万结束,
关闭进程池:
pool.close()
等待所有进程执行完毕:
pool.join() 保持主进程执行,等待所有的工作进程全部执行完成之后退出.
import multiprocessing
import time
import random
import os
def worker(msg):
# 当前时间
t_start = time.time()
print("%s开始执行,进程号为%d" % (msg, os.getpid()))
time.sleep(random.random()*2)
t_stop = time.time()
print(msg, "执行完毕,耗时%0.2f" % (t_stop-t_start))
if __name__ == '__main__':
# 1.创建进程池-->两种方式
pool = multiprocessing.Pool(10) # 参数表示进程池中的最大进程数
# 2.添加任务
pool.apply_async(func=worker, args=('333',))
# apply()添加任务的方式,阻塞的添加方式,把任务添加到进程池中的进程中执行,
# 会阻塞等待任务执行完成才会继续往下执行
pool.apply(func=worker, args=('111',))
pool.apply(func=worker, args=('000',))
print("apply done")
# 非阻塞的任务的任务添加方式,把任务添加到进程池中执行,不等待任务执行完成
pool.apply_async(func=worker, args=('222',))
# 非阻塞等待的任务添加方式,在主进程一旦执行完,就会推出推出,导致所有任务全部结束
# 3.关闭进程池(不再允许添加任务)
pool.close()
# 4.进程池等待所有任务执行完成
pool.join()
1.如果需要在进程池中使用进程间通信Queue,不要使用multiprocessing.Queue() (使用这个对列进行通信的前提是通过继承创建的进程),应该使用multiprocessing.Messager().Queue()这个对列进行进程间的通信
2..close() .terminate()之后,一般都会跟上join(),等待所有进程执行完成