16

Am diesen Fehler, wenn die pool.map(funct, iterable) mit:Python Multi Lib Error (Attribute: __exit__)

AttributeError: __exit__ 

Nein Erklärung, Stapel einzige Spur auf die pool.py Datei innerhalb des Moduls.

auf diese Weise mit:

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

ich vermute, es ein Problem mit dem picklability (Python Bedürfnisse pickle oder Listendaten in Byte-Stream-Transformation) sein könnte, aber ich bin mir nicht sicher, ob dies wahr ist oder wenn es um das Debuggen geht.

EDIT: neues Format von Code, der diesen Fehler erzeugt:

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

Fehler erzeugt hat:

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

was meinst du mit 'während .. as'? meinst du "mit"? – Elisha

+0

Fügen Sie den * vollständigen Traceback * für Fehler und Ihren tatsächlichen Code ein. 'while' ist hier zum Beispiel ein offensichtlicher Syntaxfehler, aber von der Ausnahme ist klar, dass Sie' mit' wirklich verwendet haben. –

Antwort

31

In Python 2.x und 3.0, 3.1 und 3.2, multiprocessing.Pool() Objekte sind nicht Kontext Manager. Sie können sie nicht in einer with Anweisung verwenden. Nur in Python 3.3 und höher können Sie sie als solche verwenden. Von der Python 3 multiprocessing.Pool() documentation:

New in version 3.3: Pool objects now support the context management protocol – see Context Manager Types. __enter__() returns the pool object, and __exit__() calls terminate().

Für frühere Python-Versionen, könnten Sie contextlib.closing(), verwenden aber berücksichtigen diese pool.close() nennen wollen, nicht pool.terminate(). Terminate manuell in diesem Fall:

from contextlib import closing 

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

oder erstellen Sie Ihre eigenen terminating() Kontext-Manager:

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) 
+1

Nun, Sir, danke für so eine detaillierte Erklärung. Ihre Lösung hat die Funktion einen Schritt näher an die Arbeit gebracht - jetzt bekomme ich diesen Fehler: 'PicklingError: Kann nicht : Attributsuche __builtin __. Funktion fehlgeschlagen ' – sidewaiise

+0

@sidewaiise: bist du Versuchen Sie vielleicht, eine Methode für eine Klasse zu verwenden? Siehe [Multiprocessing: Verwenden von Pool.map für eine Funktion, die in einer Klasse definiert ist] (http://stackoverflow.com/q/3288595) –

+0

Heh Ich habe das gerade gelesen, als du das gepostet hast. Danke - Ich werde kurz lesen und kommentieren. – sidewaiise

1

with Aussage ist für Objekt, das __enter__ und __exit__ Funktionen, dh Context Manager Types
multiprocessing.Pool ist nicht Kontext-Manager-Typ. versuchen Sie wie folgt vor:

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

Die Frage ist, warum das OP dachte, es sei *. Die Antwort ist, dass die Python 3-Dokumentation es Ihnen sagt. Aber es qualifiziert sich auch als Python 3.3 und höher. –

+0

ok. wusste nicht, es ist Kontext mgr in Python 3.3 und höher – Elisha