python如何将多个进程同时运行成千上万个进程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python如何将多个进程同时运行成千上万个进程相关的知识,希望对你有一定的参考价值。
在我的多处理流程中,我将不得不启动成千上万个进程,但是如果同时启动所有这些进程,恐怕服务器将耗尽内存。
我试图阅读python文档,但是对于如何实现这一点我有些困惑...
明确说明我要完成的事情。...
- 创建许多进程
- 设置一次要运行的一定数量(x)。
- 具有python启动(x)个进程,并在它们完成时,启动更多创建的进程,最多(x)个正在运行的进程
根据我对您问题的(有限的)理解,我认为您可能将工作和流程等同起来。换句话说,即使您仅want个同时运行(n个
https://docs.python.org/3.7/library/multiprocessing.html#using-a-pool-of-workers
基本上,您像这样建立了一个工作进程池(代码示例是该文档的简化版本:]
from multiprocessing import Pool
def f(x):
return x*x
with Pool(processes=4) as pool:
result = pool.apply_async(f, (20,))
print(res.get(timeout=1))
这样,您最多只能启动4个工作进程(或n,视情况而定),并且可以向它们发送无限数量的任务。工人空闲后,池将相应地调度任务。
EDIT:如Olvin Roght的评论中所述,也有https://docs.python.org/3/library/concurrent.futures.html#processpoolexecutor
根据我的经验,这取决于您要实现的目标。如果您只是想更好地掌握多处理,那么常规池就可以了。它也是较低的抽象级别,因此将迫使您真正了解自己在做什么。我是这样学习的,不要后悔。如果只是为了完成工作,则并发.futures版本更好。更高的抽象级别和非常好的API。
EDIT 2-关于阻止get()
和超时。
from multiprocessing import Pool, TimeoutError
import time
def f(x):
time.sleep(x)
return "I'm rested now"
if __name__ == '__main__':
# start 4 worker processes
with Pool(processes=4) as pool:
res = pool.apply_async(f, (10,)) # run in one process
while True:
try:
print(res.get(timeout=1))
except TimeoutError:
print("No result yet")
else:
break
如您所见,我有一个函数休眠数秒,我将其赋给池以值10执行(这意味着该函数将在工作进程中休眠10秒,然后返回结果。 。这模拟了耗时的工作)。
[在主要过程中,我尝试以1s的超时来获取结果,这意味着1s之后,停止尝试并打印未找到任何结果(尚未)(我通过捕获get抛出的TimoutError来做到这一点)。所有这些都是循环的,因此当工作进程最终完成时,我得到了结果。正如您所看到的,您的工作进程终止的原因是您的主进程因尚未捕获的TimoutError而终止(要记住的是,这些工作进程的寿命与主进程相关)。
PS:共享一些代码,如果需要更多帮助,请让我更好地了解您要实现的目标。我几乎无法估计您对这些概念的理解,更不用说猜测您正在努力实现的目标了。很难提供帮助。我的意思是,如果您只想了解多处理概念,那一切都很好,我认为有关多处理的文档以及关于SO的问题将带您到那里,但是如果您实际上是在尝试完成一些工作,那是更高级别的库,可以为您完成大部分繁重的工作(想到芹菜,但这不是唯一的库)。
以上是关于python如何将多个进程同时运行成千上万个进程的主要内容,如果未能解决你的问题,请参考以下文章
Python程序中的进程操作-进程池(multiprocess.Pool)
如何跨 Slurm 集群上的多个节点运行 MPI Python 脚本?错误:警告:无法在 2 个节点上运行 1 个进程,将 nnodes 设置为 1