2011-04-28 34 views
9

Quiero terminar un bucle ejecutándose en un hilo separado usando una variable global. pero este código no parece detener el hilo en bucle. Espero que el programa no se imprima más '.' después de 2 segundos, pero todavía se ejecuta indefinidamente.cómo compartir variables globales a través de subprocesos en python?

¿Estoy haciendo algo fundamentalmente malo aquí?

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 

Respuesta

4
  1. se está ejecutando foo() en el hilo principal llamando t1.run(). Deberías llamar al t1.start() en su lugar.

  2. Tiene dos definiciones de foo() - no importa, pero no debería estar allí.

  3. No puso un sleep() dentro del bucle de la rosca (en foo()). Esto es muy malo, ya que encierra el procesador. Debería al menos poner time.sleep(0) (liberar segmento de tiempo a otros hilos) si no hacerlo dormir un poco más.

Aquí está un ejemplo de trabajo:

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

Creo que están tratando de representar un caso en el que el hilo está haciendo un procesamiento ininterrumpido, por lo que el punto 3 es irrelevante. ¿O está diciendo que la falta de un "time.sleep (0)" impide que otros subprocesos se ejecuten debido al bloqueo de Intérprete global? –

+0

muchas gracias por la respuesta .. tengo mis errores :) – user730094

+0

@Mike: No estoy tan seguro de eso, pero sí, se me pasó por la mente. Dicho esto, sé que las implementaciones más recientes de Python han solucionado algunas de las deficiencias de GIL, y mi versión de Python ejecuta este código perfectamente, y no debería impedir que se ejecuten otros subprocesos. –

4

no empezar un hilo llamando run(), se inicia llamando start(). Solución que hizo que funcione para mí.

0

Además de las respuestas dadas ...

La variable 'correr' es una variable global.

Cuando lo modifica dentro de otra función, p. dentro de la función main(), debe hacer referencia a que la variable sea global, de lo contrario no se modificará globalmente.

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

if __name__ == "__main__": 
main() 
Cuestiones relacionadas