Ausnahme im Multiprocessing-Pool wurde nicht erkannt
Scheint es, dass wenn eine exception ausgelöst von einem multiprocessing.Pool Prozess, es gibt keine stack-trace oder ein anderer Hinweis darauf, dass es fehlgeschlagen ist. Beispiel:
from multiprocessing import Pool
def go():
print(1)
raise Exception()
print(2)
p = Pool()
p.apply_async(go)
p.close()
p.join()
Drucke 1 und hält still. Interessanterweise, das eine BaseException stattdessen funktioniert. Gibt es eine Möglichkeit, um das Verhalten für alle Ausnahmen, die gleichen wie BaseException?
InformationsquelleAutor der Frage Rob Lourens | 2011-07-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich eine vernünftige Lösung für das problem, zumindest für debugging-Zwecke. Ich derzeit nicht über eine Lösung, die erhöhen die Ausnahme wieder zurück in die wichtigsten Prozesse. Mein Erster Gedanke war, ein Dekorateur, aber Sie können nur Gurke definierten Funktionen auf der obersten Ebene eines Modulsso richtig aus.
Stattdessen eine einfache Verpackung Klasse und eine Pool-Unterklasse, die verwendet diese für
apply_async
(und damitapply
). Ich lassemap_async
als übung für den Leser.Gibt mir:
InformationsquelleAutor der Antwort Rupert Nash
Vielleicht bin ich etwas fehlt, aber ist nicht das, was die
get
Methode der Ergebnis-Objekt gibt? Sehen Prozess-Pools.So, leicht ändern Sie Ihre Beispiel, was man tun kann,
Gibt als Ergebnis
Dies ist nicht völlig zufriedenstellend, da es nicht den Druck der traceback, aber besser als nichts.
UPDATE: Dieser bug wurde in Python 3.4, mit freundlicher Genehmigung von Richard Oudkerk. Finden Sie in der Ausgabe get-Methode von multiprocessing.pool.Async sollte die Rückkehr vollen traceback.
InformationsquelleAutor der Antwort Faheem Mitha
Die Lösung mit den meisten Stimmen zum Zeitpunkt des Schreibens hat ein problem:
Als @dfrankow hingewiesen, es wird warten auf
x.get()
die Ruinen der Zeitpunkt der Ausführung einer Aufgabe asynchron. So, für bessere Effizienz (insbesondere, wenn Sie Ihre Arbeiter Funktiongo
dauert eine lange Zeit) ich würde es ändern auf:Vorteile: der worker-Funktion wird asynchron ausgeführt, wenn Sie also, zum Beispiel wenn Sie viele Aufgaben auf mehrere Kerne, es wird viel effizienter als die ursprüngliche Lösung.
Nachteile: wenn es eine Ausnahme in der worker-Funktion, es wird nur angehoben werden nach der pool hat alle Aufgaben erfüllt. Dies kann oder kann nicht wünschenswert Verhalten.BEARBEITET nach @colinfang Kommentar, die Feste.InformationsquelleAutor der Antwort gozzilli
Hatte ich Erfolg Protokollierung von Ausnahmen mit dieser decorator:
mit dem code in der Frage, es ist
Einfach dekorieren die Funktion, die Sie passieren, um Ihren Prozess pool. Der Schlüssel zu dieser Arbeit ist
@functools.wraps(func)
sonst multiprocessing wirft einenPicklingError
.code oben gibt
InformationsquelleAutor der Antwort Mark Foreman
Erstellte ich ein Modul RemoteException.py zeigt, dass die vollen traceback einer Ausnahme in einem Prozess. Python2. Herunterladen und fügen Sie diese zu Ihrem code:
InformationsquelleAutor der Antwort User
InformationsquelleAutor der Antwort erezarnon
Ich würde versuchen, mit pdb:
InformationsquelleAutor der Antwort Claris
Haben Sie
apply_sync
ich denke, die wollen irgendeine synchronisieren von Aufgaben. Benutzen Sie callback für die Behandlung ist eine weitere option. Bitte beachten: diese option ist nur verfügbar für Python ist3.2 und oben, und nicht auf python2.7.InformationsquelleAutor der Antwort Asoul
Da gibt es schon anständige Antworten für
multiprocessing.Pool
verfügbar ist, werde ich eine Lösung mit einem anderen Ansatz für die Vollständigkeit.Für
python >= 3.2
folgende Lösung scheint am einfachsten zu sein:Vorteile:
Weitere Infos über die API, überprüfen Sie bitte: https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor
Zusätzlich, wenn Sie die Vorlage eine große Anzahl von Aufgaben, und Sie möchten, dass Ihre Haupt-Prozess zu scheitern, sobald eine Ihrer Aufgaben scheitern, können Sie verwenden Sie den folgenden Codeausschnitt:
Alle anderen Antworten, nicht nur, nachdem alle Aufgaben ausgeführt wurden.
InformationsquelleAutor der Antwort Vladimir Kovalev