Python 为什么mulitprocessing.Pool运行但从不终止?
我试图使用Python 为什么mulitprocessing.Pool运行但从不终止?,python,multiprocessing,jupyter,spyder,pool,Python,Multiprocessing,Jupyter,Spyder,Pool,我试图使用mulitprocessing.Pool来加速一个函数在一系列输入中的执行。这些进程似乎已经被调用,因为我的任务管理器表明我的CPU利用率大幅提高,但任务从未终止。无论运行时还是其他情况,都不会引发异常 来自多处理导入池的 def f(x): 打印(x) 返回x**2 克拉斯班: 定义初始化(自): 通过 def foo(self): X=列表(范围(1000)) 将池(15)作为p: 结果=p.map(f,X) 如果名称=“\uuuuu main\uuuuuuuu”: obj=Kla
mulitprocessing.Pool
来加速一个函数在一系列输入中的执行。这些进程似乎已经被调用,因为我的任务管理器表明我的CPU利用率大幅提高,但任务从未终止。无论运行时还是其他情况,都不会引发异常
来自多处理导入池的
def f(x):
打印(x)
返回x**2
克拉斯班:
定义初始化(自):
通过
def foo(self):
X=列表(范围(1000))
将池(15)作为p:
结果=p.map(f,X)
如果名称=“\uuuuu main\uuuuuuuu”:
obj=Klass()
obj.foo()
打印(“全部完成!”)
有趣的是,尽管CPU利用率有所提高,print(x)
从不向控制台打印任何内容
我已经按照建议将函数f
移到了类外,但没有效果。我也尝试过添加p.close()
和p.join()
,但没有成功。使用其他Pool
类方法,如imap
会导致TypeError:cannotpickle\u thread.lock对象
错误,并且似乎与介绍中的示例用法有所不同
更让人困惑的是,如果我尝试运行代码的次数超过了足够的次数(每次尝试后都会杀死挂起的内核),那么代码就会开始像预期的那样始终如一地工作。通常需要大约二十次尝试后,这个“咔哒”声才会出现。重新启动IDE会将现在的功能代码恢复到以前的断开状态。作为参考,我使用Anaconda Python发行版(Python 3.7)在Windows 10上运行Spyder IDE。我的CPU有16个内核,因此池(15)
所需的进程数不会超过我的CPU内核数。但是,使用不同的IDE(如Jupyter Lab)运行代码会产生相同的错误结果
这可能是Spyder本身的缺陷,但建议使用
mulitprocessing.Pool
而不是mulitprocessing.Process
似乎也不起作用。这似乎是Spyder和Jupyter的问题。如果您直接在控制台中运行上述代码,则一切正常。可能与python文档相关:
注意:此软件包中的功能要求主
模块不能由子模块导入。这在编程中有介绍
然而,这里值得指出的是。这意味着
示例,例如multiprocessing.pool.pool示例将不起作用
在交互式口译员中
然后是对他们例子的评论:
如果您尝试这样做,它将实际输出三个完整的回溯
以半随机方式交错,然后您可能必须停止
主进程不知何故
更新:
所发现的信息似乎证实了从交互式口译员处使用该池将获得不同的成功。这一指导也被分享
…指南[是]始终使用定义为
重要的
这是概述的解决方案,我(每次)使用您的代码都能使用它。我知道这无助于回答问题,但
\uuuu init\uuuu
定义是多余的,因为它将从对象
继承。您能在f
中添加打印语句吗?例如,打印(x)
。这样,您就可以看到正在启动的流程。绝对可以!将print(x)
添加到f
不会将任何内容打印到控制台上。那时我什么都没有。在我的Mac电脑上从终端一字不差地运行你的代码效果很好。也许是这样,但我似乎没有得到他们提到的任何回溯。你在找什么?对于jupyter,您需要查看启动它的控制台。当我运行您的代码时,我得到了“无法获取属性'f'on”。当我在jupyter中运行python示例时,我得到了相同的消息。还可以解释为什么它有时会工作(使用其他15个内核)。我的观点是正确的。在用于启动Jupyter的控制台内部,我得到了与您相同的错误:AttributeError:无法在
上获取属性“f”。不幸的是,我无法解释为什么在多次杀死内核之后,它开始工作。我不需要更改上面的任何代码。它只是按照预期自动开始运行。另请参阅