多处理.池在Google云上产生比请求更多的进程

2024-06-16 10:19:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我用的是Python的多处理.池类在进程之间分配任务。在

简单的案例如预期的那样工作:

from multiprocessing import Pool

def evaluate:
    do_something()

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

N个进程被派生出来,它们不断地完成我传递给apply_async的任务。现在,我有另一个例子,我有许多不同的非常复杂的对象,每个对象都需要进行大量的计算活动。我最初让每个对象创建自己的多处理.池on demand当时它正在完成工作,但我最终遇到了OSError,因为打开了太多文件,尽管我本以为池在使用后会被垃圾回收。在

不管怎样,我决定还是让这些复杂对象共享同一个计算池会更好:

^{pr2}$

现在,当我在我的一台计算机(OSX,Python=3.4)上运行它时,它的工作与预期一样。N个进程被派生,每个复杂对象在每个进程之间分配任务。然而,当我在另一台机器(运行Ubuntu的Google云实例,Python=3.5)上运行它时,它会产生大量的进程(gt>N),整个程序由于争用而停止运行。在

如果我查看池了解更多信息:

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

>>> N

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

更新

我添加了一些额外的日志记录。为了简单起见,我将池大小设置为1。在池中,当任务完成时,我从多处理模块打印当前的_process(),以及使用操作系统获取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似乎是父进程。在


Tags: 对象import进程randompiddaemonprocessesapply
1条回答
网友
1楼 · 发布于 2024-06-16 10:19:38

1)您的问题包含与您运行的代码不同的代码(问题代码语法错误,根本无法运行)。
2) 多处理模块在处理/报告工作线程中发生的错误方面非常糟糕。 问题很可能出现在您没有显示的代码中。您展示的代码(如果修复的话)将永远工作并占用CPU,但它不会因打开的文件或进程太多而导致错误。在

相关问题 更多 >