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)