繁体   English   中英

在python中使用Joblib进行并行处理时,对象属性似乎没有变化

[英]Object properties does not seem change in Parallel processing using joblib in python

我有以下代码可以很好地与一个进程一起使用,但不能与多个进程一起使用。 没有错误消息,但是类属性似乎没有保存,我也不知道为什么或如何修复它。 我正在Windows下运行代码

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM