thread parallel lock async python multiprocessing pickle with-statement contextmanager

parallel - python multiprocessor



Error de Lib de multiprocesamiento de Python(AttributeError:__exit__) (2)

En Python 2.xy 3.0, 3.1 y 3.2, multiprocessing.Pool() objetos multiprocessing.Pool() no son administradores de contexto . No puedes usarlos en una sentencia with . Solo en Python 3.3 y superiores puedes usarlos como tales. Desde la documentación de Python 3 multiprocessing.Pool() :

Nuevo en la versión 3.3 : los objetos de la agrupación ahora admiten el protocolo de administración de contexto; consulte Tipos de Context Manager. __enter__() devuelve el objeto del grupo, y __exit__() llamadas terminate ().

Para versiones anteriores de Python, puede usar contextlib.closing() , pero tenga en cuenta que esto llamará a pool.close() , no a pool.terminate() . Terminar manualmente en ese caso:

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

o crea tu propio administrador de contexto 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)

Estoy recibiendo este error al usar el pool.map(funct, iterable) :

AttributeError: __exit__

Sin Explicación, solo apile la traza al archivo pool.py dentro del módulo.

utilizando de esta manera:

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

Sospecho que podría haber un problema con la picklability (Python necesita pickle , o transformar los datos de la lista en un flujo de bytes), pero no estoy seguro si esto es cierto o si es la forma de depurar.

EDITAR: nuevo formato de código que produce este error:

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

ERROR PRODUCIDO:

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


with sentencia es para el objeto que tiene funciones __enter__ y __exit__ , es decir , Tipos de Context Manager
multiprocessing.Pool no es Tipo de administrador de contexto. intente hacer lo siguiente:

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