使用带导入功能的joblib时出错

时间:2017-10-19 10:58:28

标签: python import parallel-processing multiprocessing joblib

我正在使用 joblib 来并行化我的python 3.5代码 如果我这样做:

from modules import f
from joblib  import Parallel, delayed

if __name__ == '__main__':
    Parallel( n_jobs  =  n_jobs,backend = "multiprocessing")(delayed(f)(i) for i in range( 10 ))

代码不起作用。代替:

from joblib import Parallel, delayed

def f( i ):
    # my func ...

if __name__ == '__main__':
    Parallel( n_jobs  =  n_jobs, backend = "multiprocessing")(delayed(f)(i) for i in range(10))

这有效!

有人可以解释为什么我必须将所有功能放在同一个脚本中吗?

这实在是不切实际,因为在模块中有很多我编写的函数,我不想在主脚本中复制/粘贴。

2 个答案:

答案 0 :(得分:1)

我面临着类似的使用。当我从导入调用函数时,它只是冻结,而当我调用本地函数时,它工作正常。通过使用多线程而不是像这样的多处理来解决它

Parallel( n_jobs  =  n_jobs, backend='threading')(delayed(f)(i) for i in range(10))

答案 1 :(得分:0)

我找到了一种解决方法,可让您将帮助程序功能保留在单独的模块中。对于要并行化的每个导入函数,请在主模块中定义一个代理函数,例如

def f_proxy(*args, **kwargs):
    return f(*args, **kwargs)

,只需使用delayed(f_proxy)。仍然有些不尽人意,但是比将所有辅助功能移入主模块更干净。