我正在使用 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))
这有效!
有人可以解释为什么我必须将所有功能放在同一个脚本中吗?
这实在是不切实际,因为在模块中有很多我编写的函数,我不想在主脚本中复制/粘贴。
答案 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)
。仍然有些不尽人意,但是比将所有辅助功能移入主模块更干净。