Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python如何在一次只运行几个进程的情况下对数千个进程进行多处理_Python_Multithreading_Parallel Processing - Fatal编程技术网

python如何在一次只运行几个进程的情况下对数千个进程进行多处理

python如何在一次只运行几个进程的情况下对数千个进程进行多处理,python,multithreading,parallel-processing,Python,Multithreading,Parallel Processing,在我的多处理流程中,我将不得不启动数千个进程,但我担心如果我同时启动所有进程,服务器将耗尽内存 我试图阅读python文档,但对于如何实现这一点,我感到有点困惑 为了清楚我想要完成什么 创建许多流程 设置一定数量的x一次运行。 让python启动x个进程,当它们完成时,启动更多已创建的进程,最多启动x个正在运行的进程 从我对你问题的有限理解来看,我认为你可能把工作和过程等同起来了。换句话说,您需要x个进程来运行x个作业,即使您只希望n个进程同时运行且n

在我的多处理流程中,我将不得不启动数千个进程,但我担心如果我同时启动所有进程,服务器将耗尽内存

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

为了清楚我想要完成什么

创建许多流程 设置一定数量的x一次运行。 让python启动x个进程,当它们完成时,启动更多已创建的进程,最多启动x个正在运行的进程
从我对你问题的有限理解来看,我认为你可能把工作和过程等同起来了。换句话说,您需要x个进程来运行x个作业,即使您只希望n个进程同时运行且n 基本上,您设置了一个工作进程池,例如,代码示例是文档的简化版本:

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个工作进程(视情况而定),并且您可以向它们发送无限量的任务。工作人员一有空,池就会相应地分派任务

编辑:正如奥尔文·罗格特在评论中提到的,还有

根据我自己的经验,这取决于你想要实现什么。如果您只是想更好地掌握多处理,那么使用常规池就可以了。这也是一个较低的抽象层次,因此它将迫使您真正理解自己在做什么。我是这样学的,不后悔。如果只是为了完成任务,那么concurrent.futures版本更好。更高级别的抽象和非常好的API

编辑2-关于阻止获取和超时

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:如果你需要更多帮助,请分享一些代码,让我更好地了解你想要实现的目标。我几乎无法估计你对这些概念的理解,更不用说猜猜你到底想实现什么。这使得帮助别人变得很困难。我的意思是,如果你只想理解多处理的概念,这一切都很好,我认为关于多处理和提问的博士会让你达到目的,但是如果你真的想完成一些工作,有更高级别的libs可以帮你完成大部分的繁重工作,但这并不是唯一的一个。

?你能澄清一下为什么这样的东西不适合你的用例吗?@hmm我使用了这个池,但似乎p.get方法被阻塞了,因此如果一个进程花费了很长时间,它会阻止其他进程启动。这是真的吗?我以前用过这个,看起来res.get是阻塞的,所以如果我循环了一堆进程,其中一个进程比其他进程耗时更长,那么只有一个进程在运行,直到那个进程完成。你能确认吗?是的,如果在没有超时的情况下调用res.get,它可以无限期地阻塞。但是你有不同的方法来减轻这种压力。您可以像我前面的示例中那样通过超时。或者,您可以将作业启动逻辑与获得作业逻辑的结果分开。如果您要这样做,我建议使用concurrent.future版本的池,它更易于使用。具体来看add_done_回调。我认为这里的文档非常简单,但是如果您需要澄清,请告诉我。超时是否会停止该过程,或者只是离开它并转到下一个过程,编辑:nvm我看到它会停止该过程。我不想停止这个过程,我只想等待它们全部出现,并在空闲空间打开时启动新的进程。超时只是意味着,如果在这几秒钟后我没有得到结果,我就停止尝试得到结果。get方法没有直接与正在运行的进程对话。get只是检查一个消息队列,该队列位于调用get的主进程和正在运行的完成工作的池进程之间。基本上,它读取队列直到结果到达或超时过期。