当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程。
但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。
函数原型:apply(func[, args=()[, kwds={}]])
该函数用于传递不定参数,同python中的apply函数一致,主进程会被阻塞直到函数执行结束(不建议使用,并且3.x以后不再出现)
函数原型:apply_async(func[, args=()[, kwds={}[, callback=None]]])
与apply用法一致,但它是非阻塞的且支持结果返回后进行回调
函数原型:map(func, iterable[, chunksize=None])
Pool类中的map方法,与内置的map函数用法行为基本一致,它会使进程阻塞直到结果返回 注意:虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程
函数原型:map_async(func, iterable[, chunksize[, callback]])
与map用法一致,但是它是非阻塞的
关闭进程池(pool),使其不再接受新的任务
结束工作进程,不再处理未处理的任务
主进程阻塞等待子进程的退出, join方法要在close或terminate之后使用
# 导入相关multiprocessing包
import multiprocessing
# 创建拥有CPU核心数量的进程的进程池
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
for i in range(100):
# # 阻塞等待当前任务的进程结束
# pool.apply(func=pow, args=(i,2))
# 不阻塞等待当前任务的进程结束
pool.apply_async(func=pow, args=(i, 2))
# # map函数到一个列表,阻塞等待返回值
# results = pool.map(func=print, iterable=[i for i in range(10000)])
# # 不阻塞等待返回值,未运行完就调用results会报错。
# results = pool.map_async(func=print, iterable=[i for i in range(10000)])
# close后不会有新的进程加入到pool
pool.close()
# join函数等待所有子进程结束 # 调用join之前,先调用close函数,否则会出错。
pool.join()
# # 结束工作进程,不再处理未完成的任务。
# pool.terminate()
multiprocessing.Manager()
中的Queue()
,而不是multiprocessing.Queue()
。q.put()
添加、q.get()
阻塞等待获取。扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有