1

我的程序似乎没有超出 Pool(5) 语句的范围。我在 Windows 服务器上使用 python 3.6,具有 8 个虚拟 CPU 的 64 位虚拟机。

代码如下

import pathos.multiprocessing as mp
 poolObj = mp.Pool(5)     
 docs = poolObj.map(nlp,textStr)

它在语句 Pool(5) 处挂起。我也尝试过 ProcessingPool(5),结果相同。

4

2 回答 2

1

我是pathos作者。首先......如果您发布一个可以由试图回答您的问题的人执行的代码片段,它会有所帮助。这有助于您获得更好的答案,因为它可以被更好地诊断(在这种情况下,它可能是序列化问题,也可能是freeze_supportWindows 问题,或者可能是构建问题)。

以下是我可以在摘要中建议了解更多细节的内容:

  • 你有C编译器吗?如果没有,那么您实际上并没有使用 multiprocess,这是pathos打算使用的。multiprocessing它是具有更多功能的分支。如果答案是否定的,那么您需要安装一个,然后重新构建multiprocess
  • __main__如果您正在使用 (见上文),则不需要在内部运行multiprocess,但是,在 Windows 上,您需要使用 pathos.helpers.freeze_support. 在大多数情况下,Windows 上的池都需要它。
  • 如果上述两个都很好,那么我会检查您的对象是否序列化,并且在 Windows 上,您可以确认对象是否会正确腌制multiprocessdill.checkdill 包中)。

它也可能是上述一种或多种的组合。

于 2018-06-20T03:21:03.993 回答
0

可能的解释

我遇到了类似的问题,我花了很长时间才明白发生了什么,最终我发现其中一个进程被 OOM 杀手杀死,因为它使用了太多的 RAM。
Pathos 无法检测到这一点,并且正在等待进程完成,尽管它已被杀死(并创建了一个新的空闲进程)。

在 Ubuntu 上,您可以查看内核消息以了解是否已触发 OOM 杀手:

dmesg -T

寻找提及某事的行,例如:

[2022 年 1 月 10 日星期一 02:24:40] 内存不足:杀死进程 1420(python)total-vm:14764496kB,anon-rss:13565716kB,file-rss:28kB,shmem-rss:0kB,UID:1000 pgtables: 27652kB oom_score_adj:0

重现问题

如果您想自己尝试,可以使用以下代码片段重现相同的行为:

import time
from pathos.multiprocessing import ProcessPool

def do_something(i):
    print(i, 'entering')
    time.sleep(2)
    print(i, 'returning')
    return i

with ProcessPool(2) as pool:
    results = pool.map(
        do_something,
        range(5)
    )

在执行期间,您可以使用htop杀死其中一个子进程(我的屏幕截图的最后 2 行)。如果你这样做,你最终会处于挂起状态:没有 CPU 使用,但 Python 脚本永远不会返回。

htop 多处理

于 2022-01-18T15:50:14.110 回答