为什么mulitprocessing.Pool运行但从未终止?

问题描述 投票:1回答:1

我试图使用 mulitprocessing.Pool 来加快一个函数在一系列输入中的执行速度。进程似乎被调用了,因为我的任务管理器显示我的CPU利用率大幅提高,但任务从未终止。无论是运行时还是其他情况,都没有出现异常。

from multiprocessing import Pool

def f(x):
    print(x)
    return x**2

class Klass:
    def __init__(self):
        pass

    def foo(self):
        X = list(range(1, 1000))
        with Pool(15) as p:
            result = p.map(f, X)

if __name__ == "__main__":
    obj = Klass()
    obj.foo()
    print("All Done!")

有趣的是,尽管CPU利用率上升了。print(x) 从来没有打印任何东西到控制台。

我已经把函数 f 课外 此处但没有用。我试过添加 p.close()p.join() 也没有成功。使用其他 Pool 类方法,如 imap 导致 TypeError: can't pickle _thread.lock objects 的错误,似乎与《指南》导言中的例子用法相去甚远。Python多处理文档.

更加令人困惑的是,如果我试着运行上面的代码足够多的次数(每次尝试后杀死挂起的内核),代码就会像预期的那样持续工作。通常需要20次左右的尝试才会 "点击 "到位。重新启动我的IDE,就会把现在能用的代码恢复到以前的破损状态。作为参考,我在 Windows 10 上使用 Anaconda Python 发行版 (Python 3.7) 和 Spyder IDE 运行。我的CPU有16个核心,所以 Pool(15) 并没有调用比我的CPU核更多的进程。然而,用不同的IDE(如Jupyter Lab)运行代码,会得到同样的破绽。

其他人建议 这可能是Spyder本身的一个缺陷,但建议使用 mulitprocessing.Pool 而不是 mulitprocessing.Process 似乎也不行。

python multiprocessing pool
1个回答
1
投票

这似乎可能是Spyder和Jupyter的问题。如果你直接在控制台中运行上述代码,一切都能正常工作。


0
投票

可能与以下原因有关 这个 源自python文档。

注 本包的功能要求 模块可以被子模块导入。这在编程指南中有所涉及,但值得在此指出。这意味着一些例子,如multiprocessing.pool.Pool的例子将不能在交互式解释器中使用。

然后对他们的例子进行这样的注释。

如果你尝试这样做,它实际上会以半随机的方式输出三个完整的回溯,然后你可能不得不以某种方式停止主进程。

UPDATE:找到的信息 此处 似乎证实了从交互式译员那里使用水池会有不同的成功率。 这个指导也被分享...

...的指导意见是始终使用定义可导入的函数类。

这就是概述的解决方案 此处 使用你的代码对我来说是有效的(每次)。

© www.soinside.com 2019 - 2024. All rights reserved.