我需要实现一个多处理池,它利用任意包进行计算。为此,我使用Python和joblib 0.9.0。这段代码基本上就是我想要的结构。
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())
在运行Anaconda 4.3.1 Python 3.6.0的Windows 10和Red Hat Enterprise Linux(以及带有虚拟环境的3.5和3.4)上,我得到了' 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
然而,在运行Python 3.5的Mac OS X 10.11.6和相同的joblib上,我得到了预期的输出' -1'使用完全相同的代码。 This问题本质上是相同的,但它处理的是病态而不是工作。一般的答案是在函数
中包含numpy import语句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'正如所料,但这个解决方案似乎很笨重。有没有理由为什么第一部分代码可以在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解决了上述问题,但代码对我的大多数情况都不起作用,因为它们无法被腌制。