2017-05-09 34 views
2

我需要实现一个多处理池,利用任意包进行计算。为此,我使用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可以解决上述问题,但由于不能进行酸洗,所以代码对于大多数情况都不起作用。

+0

不知道这是否回答你的问题,但比把函数导入更好的方法是将它声明为'def someComputation(x,np = np):'。在第一次解释时,它应该将该模块绑定到函数中的本地名称,从而避免每次都需要运行导入机器。 –

+0

这很好,我可以肯定地使用它,直到我们发现真正的问题。 –

回答

1

我不确定确切的问题是什么,但似乎将全局范围转移到运行该任务的子流程存在一些问题。您可以通过绑定名称np作为函数参数可能避免名称错误:

def someComputation(x, np=np): 
    return np.interp(x, [-1, 1], [-1, 1]) 

这具有不需要每次运行该功能时到进口机器呼叫的优势。在模块加载期间首次评估时,名称np将被绑定到该函数。