如何在 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 模块限制并发进程的数量

从 Python 多处理中的排队进程获取错误标志/消息

如何灵活运用Linux 进程资源监控和进程限制

如何在 FreeBSD 10.1 上增加每个进程的打开文件数限制?

限制 JavaScript 函数调用,但需要排队(不要丢弃调用)

如何在 PyQt5 中对 QProcesses 进行排队?