Ошибка Lib многопроцессорной обработки Python (AttributeError: __exit__)
Я получаю эту ошибку при использовании pool.map(funct, iterable)
:
AttributeError: __exit__
Объяснение отсутствует, только трассировка стека в файле pool.py внутри модуля.
используя таким образом:
with Pool(processes=2) as pool:
pool.map(myFunction, mylist)
pool.map(myfunction2, mylist2)
Я подозреваю, что может быть проблема с возможностью выбора (Python должен pickle
или преобразовать данные списка в поток байтов), но я не уверен, что это правда, или это как отлаживать.
РЕДАКТИРОВАТЬ: новый формат кода, который производит эту ошибку:
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 ответа
В Python 2.x и 3.0, 3.1 и 3.2 multiprocessing.Pool()
объекты не являются контекстными менеджерами. Вы не можете использовать их в with
заявление. Только в Python 3.3 и выше вы можете использовать их как таковые. Из Питона 3multiprocessing.Pool()
документация:
Новое в версии 3.3: Объекты пула теперь поддерживают протокол управления контекстом - см. Типы диспетчера контекста.
__enter__()
возвращает объект пула и__exit__()
звонки прекращаются ().
Для более ранних версий Python вы можете использовать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)