Ответ 1
В Python 2.x и 3.0, 3.1 и 3.2, multiprocessing.Pool()
объекты не являются менеджерами контекста. Вы не можете использовать их в инструкции with
. Только в Python 3.3 и выше вы можете использовать их как таковые. Из документации Python 3 multiprocessing.Pool()
:
Новое в версии 3.3: Объекты пула теперь поддерживают протокол управления контекстом - см. Типы Контекстного Менеджера.
__enter__()
возвращает объект пула, а__exit__()
вызывает terminate().
Для более ранних версий 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)