2011-04-28 27 views
9

Voglio terminare un ciclo in esecuzione in un thread separato utilizzando una variabile globale. ma questo codice non sembra interrompere il ciclo in loop. Mi aspetto che il programma non stampi più '.' dopo 2 secondi, ma funziona ancora a tempo indeterminato.come condividere le variabili globali attraverso i thread in python?

Sto facendo qualcosa di fondamentalmente sbagliato qui?

import time 
import threading 
run = True 

def foo(): 
    while run: 
     print '.', 

t1 = threading.Thread(target=foo) 
t1.run() 
time.sleep(2) 
run = False 
print 'run=False' 
while True: 
    pass 

risposta

4
  1. si sta eseguendo foo() sul thread principale chiamando t1.run(). Dovresti chiamare lo t1.start().

  2. Hai due definizioni di foo() - non importa, ma non dovrebbe esserci.

  3. Non è stato inserito un sleep() all'interno del ciclo del filo (in foo()). Questo è molto brutto, dal momento che suona il processore. Dovresti almeno inserire time.sleep(0) (rilasciare il time slice ad altri thread) se non farlo dormire un po 'più a lungo.

Ecco un esempio di lavoro:

import time 
import threading 
run = True 

def foo(): 
    while run: 
     print '.', 
     time.sleep(0) 

t1 = threading.Thread(target=foo) 
t1.start() 
time.sleep(2) 
run = False 
print 'run=False' 
while True: 
    pass 
+1

Penso che stiano cercando di rappresentare un caso in cui il thread sta eseguendo l'elaborazione non-stop, quindi il punto 3 è discutibile. o stai dicendo che la mancanza anche di un 'time.sleep (0)' impedisce l'esecuzione di altri thread a causa del Global Interpreter Lock? –

+0

molte grazie per la risposta .. ho avuto i miei errori :) – user730094

+0

@Mike: Non ne sono così sicuro, ma sì, mi è venuto in mente. Detto questo, so che le più recenti implementazioni di Python hanno risolto alcune delle carenze di GIL, e la mia versione di Python esegue questo codice perfettamente bene, e non dovrebbe impedire l'esecuzione di altri thread. –

4

Non avvia un thread chiamando run(), si avvia chiamando start(). Fixing che ha funzionato per me.

0

In aggiunta alle risposte date ...

La 'corsa' variabile è una variabile globale.

Quando lo si modifica in un'altra funzione, ad es. all'interno della funzione main(), è necessario fare riferimento alla variabile globale, altrimenti non sarà modificata globalmente.

def main(): 
    global run 
    ... 
    run = False 
    ... 

if __name__ == "__main__": 
main()