如何在 Python 中限制和排队进程
Posted
技术标签:
【中文标题】如何在 Python 中限制和排队进程【英文标题】:How to limit and queue up processes in Python 【发布时间】:2018-11-12 05:08:37 【问题描述】:假设我手头有 10000 个任务。如何并行处理它们,随时运行精确的 8 个进程?任务完成后,应立即获取下一个任务以执行。
for e in arr:
pr=Process(target=execute, args=(q,e))
pr.start()
pr.join()
我想这样做是因为我的 CPU 只有 8 个硬件线程。由于切换开销,一次使用 10000 个任务将其蜂拥而至会减慢整体计算速度。我的记忆力也有限。
(编辑:这不是this question 的重复,因为我不是在问如何分叉一个进程。)
【问题讨论】:
看Pool classes in the docs How to process a list in parallel in Python?的可能重复 我不认为这是该问题的重复,因为我不是在问如何分叉一个进程。无论如何,Pool 可能是我的问题的解决方案。谢谢,詹姆斯! 【参考方案1】:我认为,如果您将“for”循环拆分为 join 语句,您的问题可能会得到解决。现在你开始一个分叉,并希望结果回来并去做另一个分叉过程。现在没有关闭任何分叉。
for e in arr:
pr=Process(target=execute, args=(q,e))
pr.start()
for e in arr:
pr.join()
或者只是使用池和地图功能。
【讨论】:
我要去游泳池。【参考方案2】:为了让 Pool 在这里工作,我也需要调用 get()。
from multiprocessing import Pool
pl=[]
pool = Pool(8)
for e in arr:
pl.append(pool.apply_async(execute, (e))
for pl2 in pl: pl2.get()
【讨论】:
以上是关于如何在 Python 中限制和排队进程的主要内容,如果未能解决你的问题,请参考以下文章
如何在 asyncio python 中使用 subprocess 模块限制并发进程的数量
如何在 FreeBSD 10.1 上增加每个进程的打开文件数限制?