对象属性在python中使用joblib的并行处理中似乎没有变化



我有以下代码,适用于一个进程,但不适用于多个进程。没有错误消息,但类属性似乎并没有保存,我不知道为什么或如何修复它。我正在窗口下运行代码

class T:
a = 0
b = 0
c = 0
def do_something(self):
self.a = 10
self.b = 5
self.c = 1
return 'ok'
def call_T(a):
return a.do_something()
if __name__ == '__main__':
B = T()
print(B.a)
B.do_something()
print(B.a)
C = [T() for i in range(20)]
print(C[14].c)
F = Parallel(n_jobs=2)(delayed(call_T)(C[i]) for i in range(20))
print(F)
print(C[14].b)

结果是

0
10
0
['ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok']
0

现在对于相同的代码,只需更改 n_jobs=1,它就会给我正确的预期结果

0
10
0
['ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok']
5

我不知道有什么问题。任何帮助不胜感激

我找到了一个简单的答案 事实证明,joblib 只传递返回方法的结果,而不传递内存 但是,使用线程将同时传递两者

class T:
a = 0
b = 0
c = 0
def do_something(self):
self.a = 10
self.b = 5
self.c = 1
return 'ok'
def call_T(a):
return a.do_something()
if __name__ == '__main__':
B = T()
print(B.a)
B.do_something()
print(B.a)
C = [T() for i in range(20)]
print(C[14].c)
F = Parallel(n_jobs=3,backend="threading")(delayed(call_T)(C[i]) for i in range(20))
print(F)
print(C[14].b)

结果

0
10
0
['ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok']
5

最新更新