uf welchen CPU-Kernen laufen meine Python-Prozess
Die Einrichtun
Ich habe eine ziemlich komplexe Software in Python geschrieben (auf einem Windows-PC). Meine Software startet grundsätzlich zwei Python-Interpreter-Shells. Die erste Shell startet (nehme ich an), wenn Sie auf das @ doppelklickmain.py
Datei. Innerhalb dieser Shell werden andere Threads folgendermaßen gestartet:
# Start TCP_thread
TCP_thread = threading.Thread(name = 'TCP_loop', target = TCP_loop, args = (TCPsock,))
TCP_thread.start()
# Start UDP_thread
UDP_thread = threading.Thread(name = 'UDP_loop', target = UDP_loop, args = (UDPsock,))
TCP_thread.start()
DasMain_thread
startet einTCP_thread
und einUDP_thread
. Obwohl dies separate Threads sind, werden sie alle in einer einzigen Python-Shell ausgeführt.
DasMain_thread
startet auch einen Unterprozess. Dies geschieht folgendermaßen:
p = subprocess.Popen(['python', mySubprocessPath], shell=True)
Aus der Python-Dokumentation geht hervor, dass dieser Unterprozess ausgeführt wirdgleichzeitig (! in einer separaten Python-Interpreter-Sitzung / Shell. DasMain_thread
in diesem Unterprozess ist vollständig für meine GUI reserviert. Die GUI startet einTCP_thread
für alle seine Kommunikationen.
Ich weiß, dass die Dinge etwas kompliziert werden. Deshalb habe ich den gesamten Aufbau in dieser Abbildung zusammengefasst:
Ich habe mehrere Fragen zu diesem Setup. Ich werde sie hier auflisten:
Frage [ Gelöst]
Stimmt es, dass ein Python-Interpreter jeweils nur einen CPU-Kern verwendet, um alle Threads auszuführen? Mit anderen Worten, wird dasPython interpreter session 1
(aus der Abbildung) führe alle 3 Threads aus Main_thread
, TCP_thread
undUDP_thread
) auf einem CPU-Kern?
Antwort: Ja, das ist wahr. Die GIL (Global Interpreter Lock) stellt sicher, dass alle Threads gleichzeitig auf einem CPU-Kern ausgeführt werden.
Frage [Noch nicht gelöst]
Habe ich eine Möglichkeit, den CPU-Kern zu ermitteln?
Frage [eilweise gelö]
Für diese Frage vergessen wir threads, aber wir konzentrieren uns auf das subprocess Mechanismus in Python. Das Starten eines neuen Unterprozesses impliziert das Starten eines neuen Python-InterpretersBeispie. Ist das richtig
Antwort: Ja das ist richtig. Zunächst herrschte einige Verwirrung darüber, ob der folgende Code eine neue Python-Interpreterinstanz erstellen würde:
p = subprocess.Popen(['python', mySubprocessPath], shell = True)
Das Problem wurde geklärt. Dieser Code startet tatsächlich eine neue Python-Interpreter-Instanz.
Wird Python intelligent genug sein, um diese separate Python-Interpreter-Instanz auf einem anderen CPU-Kern auszuführen? Gibt es eine Möglichkeit, die zu verfolgen, möglicherweise auch mit einigen sporadischen Druckaussagen?
Frage 4 [Neue Frage]
Die Community-Diskussion hat eine neue Frage aufgeworfen. Es gibt anscheinend zwei Ansätze, um einen neuen Prozess zu erzeugen (innerhalb einer neuen Python-Interpreter-Instanz):
# Approach 1(a)
p = subprocess.Popen(['python', mySubprocessPath], shell = True)
# Approach 1(b) (J.F. Sebastian)
p = subprocess.Popen([sys.executable, mySubprocessPath])
# Approach 2
p = multiprocessing.Process(target=foo, args=(q,))
Der zweite Ansatz hat den offensichtlichen Nachteil, dass er nur eine Funktion zum Ziel hat - während ich ein neues Python-Skript öffnen muss. Wie auch immer, sind sich beide Ansätze in Bezug auf das, was sie erreichen, ähnlich?