Suis cette erreur lors de l'utilisation de la pool.map(funct, iterable)
:
AttributeError: __exit__
Aucune explication, uniquement la trace de pile dans le fichier pool.py dans le module.
en utilisant de cette manière:
with Pool(processes=2) as pool:
pool.map(myFunction, mylist)
pool.map(myfunction2, mylist2)
Je soupçonne qu'il pourrait y avoir un problème avec la picklabilité (python doit pickle
, ou transformer les données de liste en flux d'octets) mais je ne sais pas si c'est vrai ou si c'est comment déboguer.
EDIT: nouveau format de code qui produit cette erreur:
def governingFunct(list):
#some tasks
def myFunction():
# function contents
with closing(Pool(processes=2)) as pool:
pool.map(myFunction, sublist)
pool.map(myFunction2, sublist2)
ERREUR PRODUIT:
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Dans Python 2.x et 3.0, 3.1 et 3.2, multiprocessing.Pool()
les objets ne sont pas des gestionnaires de contexte . Vous ne pouvez pas les utiliser dans une instruction with
. Uniquement dans Python 3.3 et versions ultérieures, vous pouvez les utiliser en tant que telles. À partir de la fonction Python 3 multiprocessing.Pool()
documentation :
Nouveau dans la version 3.3 : les objets de pool prennent désormais en charge le protocole de gestion de contexte - voir Types de gestionnaire de contexte.
__enter__()
renvoie l'objet pool et__exit__()
les appels se terminent ().
Pour les versions antérieures Python versions, vous pouvez utiliser contextlib.closing()
, mais prenez en compte que cela appellera pool.close()
, pas pool.terminate()
. Terminez manuellement dans ce cas:
from contextlib import closing
with closing(Pool(processes=2)) as pool:
pool.map(myFunction, mylist)
pool.map(myfunction2, mylist2)
pool.terminate()
ou créez votre propre gestionnaire de contexte 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
est destinée aux objets qui ont __enter__
et __exit__
fonctions, c'est-à-dire Types de gestionnaire de contextemultiprocessing.Pool
n'est pas un type de gestionnaire de contexte. essayez de faire ce qui suit:
pool = Pool(processes=2)
pool.map(myFunction, mylist)
pool.map(myfunction2, mylist2)