2011-06-29 12 views
40

Estoy buscando terminar algunos hilos después de un cierto período de tiempo. Estos subprocesos se ejecutarán en un bucle while infinito y durante este tiempo pueden bloquearse durante un gran período de tiempo al azar. El hilo no puede durar más que el tiempo establecido por la variable de duración. ¿Cómo puedo hacer para que después de la duración establecida por la duración, los hilos se detengan.Detener un hilo después de un cierto período de tiempo

def main(): 
    t1 = threading.Thread(target=thread1, args=1) 
    t2 = threading.Thread(target=thread2, args=2) 

    time.sleep(duration) 
    #the threads must be terminated after this sleep 
+2

La última vez que solicitó esto, le recomendamos que deje que los hilos terminen por sí mismos. ¿Por qué no puedes hacer eso? http://stackoverflow.com/questions/6523526/python-multi-threading-help – Nix

+0

¿Tu hilo va a estar bloqueando? – Nix

+0

Los hilos se ejecutarán en un bucle infinito. Existe la posibilidad de que los hilos duerman durante un tiempo aleatorio. Los hilos no pueden ejecutarse durante la duración especificada al inicio del programa. Si los hilos no cuentan la cantidad de tiempo que durmieron, ¿cómo sabrán cuándo terminar? – Takkun

Respuesta

96

Esto funcionará si que no está bloqueando.

Si está planeando dormir, es absolutamente imprescindible que use el evento para dormir. Si aprovecha el evento para dormir, si alguien le dice que se detenga mientras "duerme", se despertará. Si usa time.sleep() su hilo solo se detendrá después de se despierta.

def main(): 
    t1_stop= threading.Event() 
    t1 = threading.Thread(target=thread1, args=(1, t1_stop)) 

    t2_stop = threading.Event() 
    t2 = threading.Thread(target=thread2, args=(2, t2_stop)) 

    time.sleep(duration) 
    #stop the thread2 
    t2_stop.set() 

def thread1(arg1, stop_event): 
    while(not stop_event.is_set()): 
     #similar to time.sleep() 
     stop_event.wait(time) 
     pass 


def thread2(arg1, stop_event): 
    while(not stop_event.is_set()): 
     stop_event.wait(time) 
     pass 
+0

No necesita el pase, ¿verdad? – MaxNoe

+0

¿Se supone que el 'tiempo 'en' stop_event.wait (time) 'es una variable numérica como' 1' o es el módulo 'time' como en' import time'? Parece extraño usar un módulo así, así que solo estoy revisando. – mdw7326

+2

Encontré esto en Google y tuve la misma pregunta, así que decidí que contribuiría. es fracciones de segundo. Entonces 'stop_event.wait (1)' es 1 segundo. –

9

si desea que los hilos que se detienen cuando las salidas del programa (como lo implica su ejemplo), entonces los hacen daemon threads.

Si quieres que tus hilos mueran por orden, entonces tienes que hacerlo a mano. Hay varios métodos, pero todos implican hacer una verificación en el ciclo de su hilo para ver si es el momento de salir (vea el ejemplo de Nix).

Cuestiones relacionadas