我试图使用 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
似乎也不行。
这似乎可能是Spyder和Jupyter的问题。如果你直接在控制台中运行上述代码,一切都能正常工作。