Многопроцессорность: ошибка пула и рассола – ошибка травления: не может pickle <type 'instancemethod'>: поиск атрибута __builtin __. Instancemethod failed

У меня два файла:

x.py

class BF(object) def __init__(): . . def add(self,z): . . 

y.py

 from y import BF def FUNC((a,b,bf)) . . bf.add(x) . . return bf . . if __name__ == '__main__': pool = multiprocessing.Pool(3) for i in range(len(sl)): bf_set.append(BF()) results = pool.map(FUNC,zip(sl, itertools.repeat(aa), bf_set)) 

Я также пытался определить BF внутри FUNC, но у меня получилось:

 PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed 

Я прочитал некоторые сообщения по связанным вопросам, но у них есть свой pool.map () внутри класса, поэтому решения не могут быть применены к этой проблеме (я думаю).

Есть идеи?

One Solution collect form web for “Многопроцессорность: ошибка пула и рассола – ошибка травления: не может pickle <type 'instancemethod'>: поиск атрибута __builtin __. Instancemethod failed”

Я собираюсь в основном использовать то, что у вас есть выше, но превращаю его в рабочий код. Нет проблем с сериализацией, если вы используете dill . Я использую вилку multiprocessing называемую pathos.multiprocessing , которая использует dill вместо pickle .

 >>> def FUNC((a,b,bf)): ... z = a+b ... bf.add(z) ... return bf ... >>> class BF(object): ... def add(self, z): ... self.z += z ... def __init__(self): ... self.z = 0 ... >>> from pathos.multiprocessing import ProcessingPool as Pool >>> pool = Pool() >>> >>> f = BF() >>> f.add(1) >>> fz 1 >>> >>> FUNC((0,1,f)) <__main__.BF object at 0x10d387f50> >>> >>> FUNC((0,1,f)).z 2 >>> >>> sl = [BF() for i in range(10)] >>> results = pool.map(FUNC, zip(range(len(sl)), range(len(sl)), sl)) >>> [bf.z for bf in results] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

Это работает, потому что pathos использует dill , который может сериализовать почти что угодно в python.

 >>> import dill as pickle >>> pickle.loads(pickle.dumps(bf.add)) <bound method BF.add of <__main__.BF object at 0x10d383950>> >>> pickle.loads(pickle.dumps(BF.add)) <unbound method BF.add> 

Получить pathos и dill адресу: https://github.com/uqfoundation

  • Как избежать этой ошибки травления, и как лучше всего распараллелить этот код в Python?
  • Почему я могу передать метод экземпляра для multiprocessing.Process, но не многопроцессорный.Pool?
  • Потребление бивалентного формата рассола из непитона (с сельдереем и кроликом)
  • Python pickle - как он ломается?
  • Найти дубликаты для значений смешанного типа в словарях
  • сериализация и десериализация лямбда
  • Python: макетирование вложенных функций
  • Есть ли альтернатива pickle - сохранить словарь (python)
  • Python - лучший язык программирования в мире.