Ошибка многопроцессорной обработки Python Lib (AttributeError: __exit__)

pool.map(funct, iterable) эту ошибку при использовании pool.map(funct, iterable) :

 AttributeError: __exit__ 

Нет пояснения, только трассировка стека в файл pool.py внутри модуля.

используя таким образом:

 with Pool(processes=2) as pool: pool.map(myFunction, mylist) pool.map(myfunction2, mylist2) 

Я подозреваю, что может возникнуть проблема с picklability (python необходимо рассортировать или преобразовывать данные списка в поток байтов), но я не уверен, что это правда, или если это отладка.

EDIT: новый формат кода, который вызывает эту ошибку:

 def governingFunct(list): #some tasks def myFunction(): # function contents with closing(Pool(processes=2)) as pool: pool.map(myFunction, sublist) pool.map(myFunction2, sublist2) 

ОШИБКА:

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

2 Solutions collect form web for “Ошибка многопроцессорной обработки Python Lib (AttributeError: __exit__)”

В Python 2.x и 3.0, 3.1 и 3.2 объекты multiprocessing.Pool() не являются менеджерами контекста . Вы не можете использовать их в инструкции с. Только в Python 3.3 и выше вы можете использовать их как таковые. Из документации Pulton 3 multiprocessing.Pool() :

Новое в версии 3.3 : Объекты пула теперь поддерживают протокол управления контекстом – см. Типы Контекстного Менеджера. __enter__() возвращает объект пула, а __exit__() вызывает terminate ().

Для более ранних версий Python вы можете использовать contextlib.closing() , но contextlib.closing() , что это вызовет pool.close() , а не pool.terminate() . Завершите вручную в этом случае:

 from contextlib import closing with closing(Pool(processes=2)) as pool: pool.map(myFunction, mylist) pool.map(myfunction2, mylist2) pool.terminate() 

или создать свой собственный terminating() контекстный менеджер:

 from contextlib import contextmanager @contextmanager def terminating(thing): try: yield thing finally: thing.terminate() with terminating(Pool(processes=2)) as pool: pool.map(myFunction, mylist) pool.map(myfunction2, mylist2) 

with выражением для объекта, который имеет функции __enter__ и __exit__ , т. е. типы контекстного менеджера
multiprocessing.Pool – это не тип Контекстного менеджера. попробуйте сделать следующее:

 pool = Pool(processes=2) pool.map(myFunction, mylist) pool.map(myfunction2, mylist2) 
  • Открытие более 1 файла с помощью - python
  • python: создать блок «с» для нескольких менеджеров контекста
  • Откройте список файлов, используя / в качестве менеджера контекста
  • Множественные переменные в Python 'with' statement
  • Использование Python's 'with open ()' Чтобы записать журнал, как я могу писать исключения из своего журнала?
  • С заявлением в python возвращается объект None, хотя метод __init__ работает
  • Как я высмеиваю открытое, используемое в операторе with (используя фреймворк Mock в Python)?
  • Python StringIO и совместимость с оператором `with '(менеджер контекста)
  • Python - лучший язык программирования в мире.