web-dev-qa-db-fra.com

Python Erreur de lib multiprocessing (AttributeError: __exit__)

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
30
sidewaiise

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)
51
Martijn Pieters

with est destinée aux objets qui ont __enter__ et __exit__ fonctions, c'est-à-dire Types de gestionnaire de contexte
multiprocessing.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)
1
Elisha