Il setupSu quali core della CPU sono in esecuzione i miei processi Python?
ho scritto un pezzo piuttosto complessa di software in Python (su un PC Windows). Il mio software inizia fondamentalmente due shell per interpreti Python. La prima shell si avvia (suppongo) quando si fa doppio clic sul file main.py
. Da quel guscio, altri thread vengono avviati nel modo seguente:
# 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()
Il Main_thread
avvia un TCP_thread
e UDP_thread
. Sebbene si tratti di thread separati, vengono eseguiti tutti all'interno di una singola shell Python.
Main_thread
avvia anche un sottoprocesso. Questo viene fatto nel modo seguente:
p = subprocess.Popen(['python', mySubprocessPath], shell=True)
Dalla documentazione Python, ho capito che questo è in esecuzione il sottoprocesso contemporaneamente in una sessione interprete Python/shell separato (!). Lo Main_thread
in questo sottoprocesso è completamente dedicato alla mia GUI. La GUI avvia un TCP_thread
per tutte le sue comunicazioni.
So che le cose diventano un po 'complicate. Perciò ho riassunto l'intero setup in questa figura:
Ho molte domande riguardanti questa configurazione. Io li elenco qui:
Domanda 1 [Risolto]
E 'vero che un interprete Python utilizza un solo core CPU alla volta per eseguire tutti i fili? In altre parole, lo Python interpreter session 1
(dalla figura) eseguirà tutti i 3 thread (Main_thread
, TCP_thread
e UDP_thread
) su un core della CPU?
Risposta: sì, questo è vero. Il GIL (Global Interpreter Lock) assicura che tutti i thread vengano eseguiti su un core della CPU alla volta.
Domanda 2 [Non ancora risolto]
Ho un modo per tenere traccia che core della CPU è?
Domanda 3 [parzialmente risolto]
Per questa domanda ci dimentichiamo di discussioni, ma ci concentriamo sulla sottoprocesso meccanismo in Python. L'avvio di un nuovo sottoprocesso implica l'avvio di un nuovo interprete Python istanza. È corretto?
Risposta: Sì, è corretto.In un primo momento ci fu una certa confusione sul fatto che il seguente codice dovrebbe creare una nuova istanza dell'interprete Python:
p = subprocess.Popen(['python', mySubprocessPath], shell = True)
La questione è stata chiarita. Questo codice avvia effettivamente una nuova istanza dell'interprete Python.
Will Python sarà abbastanza intelligente da rendere l'istanza di interprete Python separata eseguita su un core della CPU diverso? C'è un modo per tenere traccia di quale, forse con alcune dichiarazioni di stampa sporadiche?
Domanda 4 [Nuova domanda]
La discussione comunità ha sollevato una nuova domanda. Ci sono apparentemente due approcci quando generando un nuovo processo (all'interno di una nuova istanza interprete Python):
# 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,))
Il secondo approccio ha lo svantaggio evidente che esso si rivolge solo una funzione - che, ho bisogno di aprire un nuovo script Python . Ad ogni modo, entrambi gli approcci sono simili in ciò che ottengono?
https://docs.python.org/2/library/multiprocessing.html – mootmoot
Penso che dovresti mettere in discussione il motivo per cui ti preoccupi di quali core fisici i thread eseguono. In genere, il sistema operativo sposta i thread tra le CPU disponibili nel sistema in base a vari fattori. C'è qualche ragione particolare per cui vuoi monitorare e/o interferire con questo processo? – Dolda2000
Buona domanda :-). Sì, credo di avere una ragione valida. Sto costruendo un sistema di acquisizione dati in Python, che legge i miei dati del microcontrollore (come gli ingressi analogici, ...) e mostra grafici in diretta nella mia GUI. Finché i dati in arrivo sono limitati, a nessuno interessa il multiprocessing. Ma una volta diventato molto veloce, voglio avere il controllo. Forse posso fare in modo che alcune parti a bassa latenza del mio software Python girino su un core CPU dedicato che non uso per nient'altro, assicurando quindi un'alta reattività. –