我的程序似乎没有超出 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),结果相同。
我是pathos
作者。首先......如果您发布一个可以由试图回答您的问题的人执行的代码片段,它会有所帮助。这有助于您获得更好的答案,因为它可以被更好地诊断(在这种情况下,它可能是序列化问题,也可能是freeze_support
Windows 问题,或者可能是构建问题)。
以下是我可以在摘要中建议了解更多细节的内容:
multiprocess
,这是pathos
打算使用的。multiprocessing
它是具有更多功能的分支。如果答案是否定的,那么您需要安装一个,然后重新构建multiprocess
。__main__
如果您正在使用
(见上文),则不需要在内部运行multiprocess
,但是,在 Windows 上,您需要使用
pathos.helpers.freeze_support
. 在大多数情况下,Windows 上的池都需要它。multiprocess
(dill.check
在dill
包中)。它也可能是上述一种或多种的组合。
我遇到了类似的问题,我花了很长时间才明白发生了什么,最终我发现其中一个进程被 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 脚本永远不会返回。