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_threadin 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?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage