Ошибка многопроцессорности с результатами

У меня небольшая проблема в большой программе, поэтому я сделал небольшой пример, который показывает мою проблему:

import multiprocessing class class1(): def classfunction1(self, a): self.x = a class class2(): def classfunction2(self, a): self.y = a def test(i): print("I'm in the Testfunction") b = i * class1.x * class2.y return b class1 = class1() class2 = class2() if __name__ == "__main__": x = 1 y = 2 class1.classfunction1(x) class2.classfunction2(y) print("This variable is callable", class1.x) print("And this one is also callable", class2.y) counter = [] for i in range(10): counter.append(i) pool = multiprocessing.Pool(processes=4) results = pool.imap(test, counter) pool.close() pool.join() #resultslist = list(results) 

Когда я использую последнюю строку resultslist = list(results) я получаю следующую ошибку:

 multiprocessing.pool.RemoteTraceback: 
 Traceback (most recent call last): File "C:\Program Files\Anaconda3\lib\multiprocessing\pool.py", line 119, in worker result = (True, func(*args, **kwds)) File "C:\Users\example2.py", line 24, in test b = i * class1.x * class2.y AttributeError: 'class1' object has no attribute 'x' The above exception was the direct cause of the following exception: 
 Traceback (most recent call last): File "C:\Users\example2.py", line 43, in <module> resultslist = list(results) File "C:\Program Files\Anaconda3\lib\multiprocessing\pool.py", line 695, in next raise value AttributeError: 'class1' object has no attribute 'x' 

Необходимо, чтобы команды class1.classfunction1(x) и class2.classfunction2(y) находились в if__name__=="__main__" . Мне нужна базовая структура этого скрипта, поэтому, пожалуйста, не делайте слишком много изменений (если это возможно).

2 Solutions collect form web for “Ошибка многопроцессорности с результатами”

Проблема заключается в том, что вы пытаетесь получить доступ к атрибуту x экземпляра класса class1 класса class1 (!), class1.classfunction1() никогда не был создан в подпроцессах рабочих, поскольку class1.classfunction1() не вызывается в них.

Чтобы исправить эту проблему, я добавил функцию init() и вызвал ее как в основном процессе, так и в качестве функции initializer для каждого из подпроцессов, созданных Pool :

 import multiprocessing class class1(): def classfunction1(self, a): self.x = a class class2(): def classfunction2(self, a): self.y = a def test(i): print("I'm in the Testfunction") b = i * class1.x * class2.y return b def init(): # added global class1, class2 class1 = class1() class2 = class2() x = 1 y = 2 class1.classfunction1(x) class2.classfunction2(y) if __name__ == "__main__": init() # explicit call here print("This variable is callable", class1.x) print("And this one is also callable", class2.y) counter = [] for i in range(10): counter.append(i) pool = multiprocessing.Pool(initializer=init, processes=4) # implicit call results = pool.imap(test, counter) pool.close() pool.join() resultslist = list(results) print(resultslist) 

Работала на моей машине python 2.7.10

  ('This variable is callable', 1) ('And this one is also callable', 2) I'm in the Testfunction I'm in the Testfunction I'm in the Testfunction I'm in the Testfunction I'm in the Testfunction I'm in the Testfunction I'm in the Testfunction I'm in the Testfunction I'm in the Testfunction I'm in the Testfunction [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 
  • Вызов функции Python из кода Javascript
  • Вызов функции из другого файла в Python
  • Ptyon ctypes: как изменить существующий массив char *
  • Python: разрешение имен; порядок функции def
  • функция python произвольное циклирование, если утверждения
  • Можем ли мы получить доступ к внутренней функции вне ее внешней функции в python, используя внешнюю функцию?
  • Могу ли я передавать значения словаря / ввод и клавиши для работы
  • Numpy: примените функцию к двум массивам numpy и возвратите два массива numpy
  • Python - лучший язык программирования в мире.