代码之家  ›  专栏  ›  技术社区  ›  mavios

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

  •  0
  • mavios  · 技术社区  · 6 年前

    我有以下代码,可以很好地处理一个进程,但不能处理多个进程。没有错误消息,但类属性似乎无法保存,我不知道为什么或如何修复它。我在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
    

    我不知道怎么回事。如有任何帮助,我们将不胜感激

    1 回复  |  直到 6 年前
        1
  •  0
  •   mavios    6 年前

    我找到了一个简单的答案 原来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