[Python, Multiprocessing] Verhalten für Ausnahmen bei Verwendung von Multiprocessing

Obwohl "Multiprocessing" für die parallele Verarbeitung in Python verwendet wird, unterscheidet sich das Verhalten, wenn ein untergeordneter Prozess durch "Multiprocessing" erstellt wird, vom Verhalten eines normalen Funktionsaufrufs.

Vorbereitung

Dieses Mal wird der Einfachheit halber die Funktion "sleep_bug ()" verwendet. Dies ist eine Funktion, die "1/0" ausführt, wenn "i == 5", um einen Fehler zu erzeugen, um absichtlich einen Fehler während der Ausführung zu erzeugen.

import time

def sleep_bug():
    for i in range(10):
        print('sleeping %d' % i)
        if i == 5:
            1/0
        time.sleep(1)
    return i

sleep_bug()

 output
'''
sleeping 0
sleeping 1
sleeping 2
sleeping 3
sleeping 4
sleeping 5
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-44-d9f02a4cf7f3> in <module>
----> 1 sleep_bug()

<ipython-input-41-26bb27998e63> in sleep_bug()
     12         print('sleeping %d' % i)
     13         if i==5:
---> 14             1/0
     15         time.sleep(1)
     16 

ZeroDivisionError: division by zero
'''

Selbst wenn der untergeordnete Prozess einen Fehler verursacht, wird der übergeordnete Prozess weiterhin ausgeführt.

Wenn bei einem normalen Funktionsaufruf ein Fehler in der aufgerufenen Funktion auftritt, stoppt das Programm dort. Wenn jedoch ein mit Pool erstellter untergeordneter Prozess ausgeführt wird, um "sleep_bug ()" auszuführen, wird der untergeordnete Prozess mit einem Fehler gestoppt, der übergeordnete Prozess wird jedoch bis zum Ende fortgesetzt, ohne einen Fehler zu verursachen.

from multiprocessing import Pool
p = Pool(1)
r = p.apply_async(sleep_bug)
p.close()
 p.join () #Warten Sie, bis der untergeordnete Prozess endet.
print('Done')

 output
'''
sleeping 0
sleeping 1
sleeping 2
sleeping 3
sleeping 4
sleeping 5
Done
'''

Verwenden Sie r.get (), um sicherzustellen, dass der Fehler auch an den übergeordneten Prozess übertragen wird, wenn ein Fehler in einem untergeordneten Prozess auftritt und dieser stoppt. r.get () ist eine Funktion, die normalerweise darauf wartet, dass der untergeordnete Prozess beendet wird, und den Rückgabewert des untergeordneten Prozesses ausgibt. Wenn jedoch ein Fehler im untergeordneten Prozess auftritt, r.get () Löst eine Ausnahme aus und der übergeordnete Prozess wird dort ebenfalls gestoppt.

from multiprocessing import Pool
p = Pool(1)
r = p.apply_async(sleep_bug)
p.close()
output = r.get()
print('Done %d' % output)

# Ausgabe
'''
sleeping 0
sleeping 1
sleeping 2
sleeping 3
sleeping 4
sleeping 5
---------------------------------------------------------------------------
RemoteTraceback                           Traceback (most recent call last)
RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/pool.py", line 121, in worker
    result = (True, func(*args, **kwds))
  File "<ipython-input-41-26bb27998e63>", line 14, in sleep_bug
    1/0
ZeroDivisionError: division by zero
"""

The above exception was the direct cause of the following exception:

ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-50-fb8f5892e1a7> in <module>
      3     r = p.apply_async(sleep_bug)
      4     p.close()
----> 5     output = r.get()
      6     print('Done %d' % output)

/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/pool.py in get(self, timeout)
    655             return self._value
    656         else:
--> 657             raise self._value
    658 
    659     def _set(self, i, obj):

ZeroDivisionError: division by zero
'''

Wenn Sie "Prozess" verwenden, wird ein Fehler angezeigt, der übergeordnete Prozess wird jedoch bis zum Ende fortgesetzt.

from multiprocessing import Process
p = Process(target=sleep_bug)
p.start()
p.join()
print('Done')

# Ausgabe
'''
sleeping 0
sleeping 1
sleeping 2
sleeping 3
sleeping 4
sleeping 5
Process Process-35:
Traceback (most recent call last):
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "<ipython-input-41-26bb27998e63>", line 14, in sleep_bug
    1/0
ZeroDivisionError: division by zero
Done
'''

Der untergeordnete Prozess wird auch dann weiter ausgeführt, wenn der übergeordnete Prozess gestoppt wird

Im folgenden Skript wartet der untergeordnete Prozess 2 Sekunden, während er ausgeführt wird, und der übergeordnete Prozess beendet sich dort mit "sys.exit ()". Wie im folgenden Ausführungsbeispiel gezeigt, wird der untergeordnete Prozess auch dann weiter ausgeführt, wenn der übergeordnete Prozess in der Mitte stoppt.

from multiprocessing import Pool
p = Pool(1)
r = p.apply_async(sleep)
p.close()
 r.wait (2) #warte 2 Sekunden für den untergeordneten Prozess
sys.exit()

# Ausgabe
'''
sleeping 0
sleeping 1
An exception has occurred, use %tb to see the full traceback.

SystemExit
sleeping 2
sleeping 3
sleeping 4
sleeping 5
sleeping 6
sleeping 7
sleeping 8
sleeping 9
'''

Recommended Posts

[Python, Multiprocessing] Verhalten für Ausnahmen bei Verwendung von Multiprocessing
Überprüfen Sie das Verhalten beim Zuweisen von Python
Verhalten beim Auflisten in Python heapq
[TouchDesigner] Tipps für die Anweisung von Python
[Python] Seien Sie vorsichtig, wenn Sie Druck verwenden
[Python] Grund für das Überschreiben mit super ()
[Python] Neunundneunzig Tabellen, die for-Anweisungen verwenden
Vorsichtsmaßnahmen bei der Verwendung von Phantomjs aus Python
Bei Verwendung von MeCab mit virtualenv python
Vorsichtsmaßnahmen bei Verwendung von sechs mit Python 2.5
Bei Verwendung regulärer Ausdrücke in Python
Dinge, auf die Sie achten müssen, wenn Sie Standardargumente in Python verwenden
Effektiver Python-Hinweis Punkt 17 Respektieren Sie die Sicherheit, wenn Sie Iteratoren für Argumente verwenden
Python-Entwicklungsumgebung für macOS mit venv 2016
Periodische Ausführungsverarbeitung bei Verwendung von tkinter [Python3]
[50 zählt] Schlüsselübertragung mit Python für Windows
Platzierung von Fabicon (bei Verwendung von Python, Flask, Heroku)
Vorsichtsmaßnahmen bei Verwendung der for-Anweisung in Pandas
Tipps zur Verwendung von Python + Caffe mit TSUBAME
Hinweise zur Verwendung von Python (Pydev) mit Eclipse
Hinweise zum Einrichten eines Docker-Containers für die Verwendung von JUMAN ++, KNP, Python
Ein nützlicher Hinweis, wenn Sie Python nach langer Zeit verwenden
Python [für mich]
vprof - Ich habe versucht, den Profiler für Python zu verwenden
Verwendung mehrerer Argumente bei der Parallelverarbeitung mithilfe der Mehrfachverarbeitung in Python
Python-Pandas: Suchen Sie mit regulären Ausdrücken nach DataFrame
[Python, CPython] GC-Verhalten beim Auslösen einer Ausnahme
Starten Sie Python
Mit dem Evernote SDK für Python 3 erhalten Sie Informationen zu Notizen
Vorsichtsmaßnahmen bei der Verwendung von tf.keras.layers.TimeDistributed für die benutzerdefinierte Ebene von tf.keras
Zeichenkodierung bei Verwendung des CSV-Moduls von Python 2.7.3
Verbesserte Suche nach Pokemon-Rennwerten mit Python
Dinge, die Sie bei der Verwendung von Python beachten sollten, wenn Sie MATLAB verwenden
[Für Anfänger] Unerwartetes Verhalten, wenn beim Festlegen des Pfads in Python "\" enthalten ist
Lassen Sie uns mit SWIG ein Modul für Python erstellen
Verhalten beim Speichern eines Python-Datetime-Objekts in MongoDB
Scraping mit Python
[Python] Hinweise zur Beschleunigung genetischer Algorithmen mithilfe von Multiprocessing
Was verwenden Sie beim Testen mit Python?
Lassen Sie uns Covid-19 (Corona) -Daten mit Python analysieren [Für Anfänger]
Grundeinstellungen für die Verwendung von Python3.8 und pip unter CentOS8
Durchsuchen von Pixiv-Tags und Speichern von Illustrationen mit Python
Erweiterbare Skelette für Vim mit Python, Click und Jinja2
Verzeichnisstruktur für die testgetriebene Entwicklung mit pytest in python
Vorsichtsmaßnahmen bei Verwendung von sqlite3 von macOS Sierra (10.12) mit Multiprocessing
Grundeinstellungen bei Verwendung der foursquare-API mit Python
[Hikari-Python] Kapitel 07-01 Ausnahmebehandlung (Fehler und Ausnahmen)
[Heroku] Memo zum Bereitstellen von Python-Apps mit Heroku unter Windows [Python]
Fehler aufgrund eines Konflikts zwischen Pythons bei der Verwendung von Gurobi
Überprüfen Sie types_map, wenn Sie Mimetypen mit AWS Lambda (Python) verwenden.
Installationsmethode bei Verwendung von RealSense aus Python (pyenv edition)
Ursachen, wenn die Python-Version nicht mit pyenv geändert werden kann
Beenden bei Verwendung von Python in Terminal (Mac)
Code-Änderungsort bei kostenloser Verwendung von Plotly
Fehler beim Ausführen von Python-Befehlen ohne Verwendung der Anaconda-Eingabeaufforderung
Artikel, die angezeigt werden, wenn die Installation für Python + OpenCV fehlschlägt
Mindestnotizen bei Verwendung von Python auf Mac (pyenv edition)
Konstruktionsnotiz für eine maschinelle Lernumgebung von Python