python如何将多个进程同时运行成千上万个进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python如何将多个进程同时运行成千上万个进程相关的知识,希望对你有一定的参考价值。

在我的多处理流程中,我将不得不启动成千上万个进程,但是如果同时启动所有这些进程,恐怕服务器将耗尽内存。

我试图阅读python文档,但是对于如何实现这一点我有些困惑...

明确说明我要完成的事情。...

  1. 创建许多进程
  2. 设置一次要运行的一定数量(x)。
  3. 具有python启动(x)个进程,并在它们完成时,启动更多创建的进程,最多(x)个正在运行的进程
答案

根据我对您问题的(有限的)理解,我认为您可能将工作和流程等同起来。换句话说,即使您仅want个同时运行(n个需要个进程即可运行x个作业。那就是泳池的用途。

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)

在多处理中如何将 CPU 内核分配给 python 进程?

python并发编程之多进程(理论)

如何跨 Slurm 集群上的多个节点运行 MPI Python 脚本?错误:警告:无法在 2 个节点上运行 1 个进程,将 nnodes 设置为 1

在Python中,如何将多个进程与popen链接在一起,同时将中间部分结果重定向到一个字符串中

十python进程和线程