Bei der gleichzeitigen Programmierung sind Multithreading und Multiprozess zwei Modi, die häufig verwendet werden (zusätzlich zu Coroutinen usw.). Aufgrund der GIL-Einschränkungen von CPython (Jython und IronPython haben keine GIL, PyPy versucht, die GIL zu entfernen) können nur Threads, die die GIL erhalten haben, die CPU nutzen, sodass sie möglicherweise zusätzlich einige E/A verarbeiten müssen blockiert (Lesen und Schreiben von Dateien, Zugriff auf das Netzwerk usw.), wird im Grunde niemand das Multithreading von CPython verwenden. Daher wird in diesem Artikel über eine nützlichere Python-Multiprozessprogrammierung gesprochen.
Hinweis: Empfohlenes Lernen: Python-Video-Tutorial)
Die hier beschriebene Umgebung Artikel ist CPython unter dem Linux-Betriebssystem (gilt auch für die meisten POSIX-Systeme) und ist möglicherweise nicht auf Windows-Betriebssysteme oder andere Python-Implementierungen anwendbar.
Um Mehrdeutigkeiten zu vermeiden, wird im Folgenden „Hauptprozess“ oder „aktueller Prozess“ verwendet, um auf den Prozess zu verweisen, der den untergeordneten Prozess erstellt hat, und nicht „übergeordneter Prozess“, es sei denn, „xx ist übergeordneter Prozess“. ausdrücklich angegeben.
Anders als bei der Multithread-Programmierung muss ein aufrufbares Objekt übergeben werden. Bei der Multiprozessprogrammierung wird der Hauptprozess in den untergeordneten Prozess kopiert, und der untergeordnete Prozess kann nicht direkt zur Ausführung eines aufrufbaren Objekts aufgefordert werden .
In POSIX-Systemen wird dieser Kopiervorgang durch die Systemaufrufe clone() und fork() abgeschlossen, wobei letzterer im Allgemeinen verwendet wird.
Wenn fork() erfolgreich ausgeführt wird, werden die PID und 0 des untergeordneten Prozesses im Hauptprozess bzw. im untergeordneten Prozess zurückgegeben, und dann beginnt der Ausführungscode unterschiedlich zu sein. Wenn dies fehlschlägt (nicht genügend Speicher, PID erreicht die Obergrenze usw.), wird der untergeordnete Prozess nicht erstellt, der Hauptprozess gibt -1 zurück und errno wird auf den entsprechenden Fehlercode gesetzt.
In der Implementierung von CPython ist os.fork() hauptsächlich eine Kapselung der Funktion fork(). Der Unterschied besteht darin, dass ein OSError ausgelöst wird. Das errno-Attribut der Ausnahme ist der entsprechende Fehlercode.
Daher sieht der Multiprozess-Python-Code ungefähr so aus:
import os try: pid = os.fork() if pid == 0: # 子进程 # 子进程的代码 else: # 主进程 # 主进程的代码 except OSError: # 主进程处理 fork 失败的代码
Weitere technische Artikel zum Thema Python finden Sie im Python-Tutorial Kolumne Fang an zu lernen!
Das obige ist der detaillierte Inhalt vonWann sollte man Multiprozessprogrammierung in Python verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!