Ошибка 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)
Другие вопросы по тегам