我正在尝试使用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 Distribution(Python 3.7(和Spyder IDE运行。我的CPU有16个核心,所以Pool(15)
调用的进程不会比我的CPU核心多。然而,使用不同的IDE(如Jupyter Lab(运行代码会产生相同的坏结果。
其他人认为这可能是Spyder本身的缺陷,但使用mulitprocessing.Pool
而不是mulitprocessing.Process
的建议似乎也不起作用。
可能与python文档中的有关
注意此程序包中的功能要求main模块可由子级导入。这包含在编程中然而,指导方针值得在这里指出。这意味着示例,例如multiprocessing.pool.pool示例将不起作用在交互式解释器中。
然后对他们的例子进行评论:
如果你尝试这样做,它实际上会输出三个完整的回溯以半随机的方式交错,然后你可能不得不停下来不知何故,主进程。
更新:这里找到的信息似乎证实了使用交互式解释器的池将取得不同的成功。该指南也被分享。。。
。。。指导方针是始终使用定义为重要的。
这是这里概述的解决方案,对我(每次(使用您的代码都有效。
这似乎是Spyder和Jupyter的问题。如果您直接在控制台中运行上面的代码,那么一切都会按预期进行。