gpt4 book ai didi

python - multiprocessing.Pool 生成的进程多于仅在 Google Cloud 上请求的进程

转载 作者:太空狗 更新时间:2023-10-29 20:31:48 28 4
gpt4 key购买 nike

我正在使用 Python 的 multiprocessing.Pool 类在进程之间分配任务。

简单案例按预期工作:

from multiprocessing import Pool

def evaluate:
do_something()

pool = Pool(processes=N)
for task in tasks:
pool.apply_async(evaluate, (data,))

产生了 N 个进程,它们不断地完成我传递给 apply_async 的任务。现在,我有另一个案例,我有许多不同的非常复杂的对象,每个对象都需要进行大量计算事件。我最初让每个对象创建自己的 multiprocessing.Pool 按需在它完成工作时,但我最终遇到了 OSError 因为打开了太多文件,即使我假设池使用后会收集垃圾。

无论如何,我决定最好让这些复杂对象中的每一个共享同一个池进行计算:

from multiprocessing import Pool

def evaluate:
do_something()

pool = Pool(processes=N)

class ComplexClass:

def work:
for task in tasks:
self.pool.apply_async(evaluate, (data,))

objects = [ComplexClass() for i in range(50)]

for complex in objects:
complex.pool = pool


while True:
for complex in objects:
complex.work()

现在,当我在我的一台计算机(OS X,Python=3.4)上运行它时,它按预期工作。产生了 N 个进程,每个复杂对象将它们的任务分配给它们中的每一个。然而,当我在另一台机器上运行它时(谷歌云实例运行 Ubuntu,Python=3.5),它产生了大量的进程(>> N)并且整个程序由于争用而停止。

如果我检查池以获取更多信息:

import random
random_object = random.sample(objects, 1)
print (random_object.pool.processes)

>>> N

一切看起来都是正确的。但显然不是。有什么想法吗?

更新

我添加了一些额外的日志记录。为简单起见,我将池大小设置为 1。在池中,当任务完成时,我从多处理模块打印 current_process(),以及使用 os.getpid() 的任务 pid。结果是这样的:

<ForkProcess(ForkPoolWorker-1, started daemon)>, PID: 5122
<ForkProcess(ForkPoolWorker-1, started daemon)>, PID: 5122
<ForkProcess(ForkPoolWorker-1, started daemon)>, PID: 5122
<ForkProcess(ForkPoolWorker-1, started daemon)>, PID: 5122
...

再次,查看使用 htop 的实际事件,我看到许多进程(每个对象一个共享多处理池)在发生这种情况时都在消耗 CPU 周期,导致如此多的操作系统争用,以至于进展非常缓慢。 5122 似乎是父进程。

最佳答案

1。无限循环实现

如果你实现一个无限循环,那么它就会像一个无限循环一样运行。你的例子(由于其他原因根本不起作用)......

while True:
for complex in objects:
complex.work()

2。 Spawn 或 Fork 进程?

即使您上面的代码只显示了一些片段,您也不能指望一方面在 Windows/MacOS 上和另一方面在 Linux 上获得相同的结果。前者生成进程,后者派生进程。如果你使用可以有状态的全局变量,你会在一个环境上开发并在另一个环境上运行时遇到麻烦。

确保不要在您的流程中使用全局有状态变量。只需显式传递它们或以其他方式摆脱它们。

3。使用程序,而不是脚本

编写一个具有__main__ 的最低要求的程序。特别是,当您使用 Multiprocessing 时,您需要这个。在该命名空间中实例化您的 Pool。

关于python - multiprocessing.Pool 生成的进程多于仅在 Google Cloud 上请求的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47335785/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com