Свойства объекта не изменяются при параллельной обработке с использованием joblib в python - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть следующий код, который хорошо работает с одним процессом, но не работает более чем с одним. Нет сообщений об ошибках, но свойства класса, похоже, не сохраняются, и я понятия не имею, почему или как это исправить. Я бегу код под 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 Ответ

0 голосов
/ 12 сентября 2018

я нашел простой ответ получается, что 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
...