我需要实现一个多处理池,利用任意包进行计算。为此,我使用Python和joblib 0.9.0。这段代码基本上是我想要的结构。Python多处理池功能没有定义
import numpy as np
from joblib import pool
def someComputation(x):
return np.interp(x, [-1, 1], [-1, 1])
if __name__ == '__main__':
some_set_of_numbers = [-1,-0.5,0,0.5,1]
the_pool = pool.Pool(processes=2)
solutions = [the_pool.apply_async(someComputation, (x,)) for x in some_set_of_numbers]
print(solutions[0].get())
在Windows 10和Red Hat Enterprise Linux上运行蟒蛇4.3.1的Python 3.6.0(以及3.5和3.4虚拟ENVS),我得到的是 'NP' 从未传递到someComputation( )功能提高了错误
File "C:\Anaconda3\lib\site-packages\multiprocessing_on_dill\pool.py", line 608, in get
raise self._value
NameError: name 'np' is not defined
然而,在我的Mac OS X 10.11.6运行的Python 3.5和相同的JOBLIB,我得到完全相同的代码预期输出“-1”。 This问题本质上是一样的,但它处理的是病态而不是joblib。一般的答案是包括功能
from joblib import pool
def someComputation(x):
import numpy as np
return np.interp(x, [-1, 1], [-1, 1])
if __name__ == '__main__':
some_set_of_numbers = [-1,-0.5,0,0.5,1]
the_pool = pool.Pool(processes=2)
solutions = [the_pool.apply_async(someComputation, (x,)) for x in some_set_of_numbers]
print(solutions[0].get())
这解决了在Windows和Linux机器的问题,他们现在输出“-1”预期内的numpy的import语句,但这个解决方法看起来笨重。有什么理由为什么第一个代码可以在Mac上使用,但不能在Windows或Linux上使用?我最终需要在Linux机器上运行此代码,因此是否有任何修复程序不包括将import语句放入函数中?
编辑:
调查远一点后,我发现一个旧的解决办法我以前放在几年,看起来就像是导致该问题。在JOBLIB/pool.py,我改变线44从
from multiprocessing.pool import Pool
到
from multiprocessing_on_dill.pool import Pool
支持的任意函数酸洗。出于某种原因,这种变化是真正导致Windows和Linux上的问题,但Mac机运行得很好。使用多处理而不是multiprocessing_on_dill可以解决上述问题,但由于不能进行酸洗,所以代码对于大多数情况都不起作用。
不知道这是否回答你的问题,但比把函数导入更好的方法是将它声明为'def someComputation(x,np = np):'。在第一次解释时,它应该将该模块绑定到函数中的本地名称,从而避免每次都需要运行导入机器。 –
这很好,我可以肯定地使用它,直到我们发现真正的问题。 –