如何在Python的'joblib'库中共享变量

6
from joblib import Parallel, delayed

def func(v):
    temp.append(v)
    return

temp = []
Parallel(n_jobs=4)(delayed(func)(v) for v in range(10))
print temp

我想创建共享内存变量。但是temp的值为空[]。我该怎么办?

在尝试其他方法时,我尝试了pickle.dump和load。但存在锁定问题。请给我建议!


我认为这个代码应该是 Parallel(n_jobs=4)(delayed(func(v)) for v in range(10)) - Avinash Raj
@AvinashRaj 感谢您的评论。您的命令有一个错误。"TypeError:'function'对象不可迭代"。 - KyungHoon Kim
2个回答

11
from joblib import Parallel, delayed

def func(v):
    return v

temp = Parallel(n_jobs=4)(delayed(func)(v) for v in range(10))
print temp

delayed会在完成后将func返回的输出收集到列表中并返回。


8
你需要使用multiprocessing.Manager.list,例如:

from joblib import Parallel, delayed
from multiprocessing import Manager

manager = Manager()
temp = manager.list()

def func(v, temp):
    temp.append(v)
    return

_ = Parallel(n_jobs=4)(delayed(func)(v, temp) for v in range(10))

temp[:]:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

它不再像以前那样运行了。将 def func... 移动到导入语句之后,将其他所有内容放在 if "__name__" == __main__: 内部。然后导入 freeze_support 并在 if 行之后立即调用它(它是一个函数)。 - Jann Poppinga
1
@JannPoppinga,你说的“它不再像以前那样运行”是什么意思?我已经尝试过了,它可以正常工作。你有特定版本的库想要使用吗? - Codoscope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接