2011-06-29 15 views
40

Je cherche à terminer certains threads après un certain temps. Ces threads exécuteront une boucle while infinie et pendant ce temps, ils peuvent se bloquer pendant une longue période aléatoire. Le thread ne peut pas durer plus longtemps que l'heure définie par la variable de durée. Comment puis-je le faire après la durée définie par la durée, les threads s'arrêter.Arrêt d'un thread après un certain temps

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 dernière fois que vous avez demandé cela, nous vous recommandons de laisser les threads se terminer. Pourquoi ne peux-tu pas faire ça? http://stackoverflow.com/questions/6523526/python-multi-threading-help – Nix

+0

Est-ce que votre thread va bloquer? – Nix

+0

Les threads seront exécutés dans une boucle infinie. Il y a une possibilité que les threads dorment pendant un laps de temps aléatoire. Les threads ne peuvent absolument pas dépasser la durée spécifiée au début du programme. Si les fils ne sont pas combien de temps ils ont dormi, comment sauront-ils quand finira-t-il? – Takkun

Répondre

96

Cela fonctionne si vous n'êtes pas le blocage.

Si vous prévoyez de dormir, il est absolument impératif que vous utilisiez l'événement pour dormir. Si vous utilisez l'événement pour dormir, si quelqu'un vous dit d'arrêter pendant qu'il dort, il se réveillera. Si vous utilisez time.sleep() votre thread s'arrêtera seulement après il se réveille.

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

Vous n'avez pas besoin de la passe, n'est-ce pas? – MaxNoe

+0

Est-ce que le 'time' dans' stop_event.wait (time) 'est censé être une variable numérique comme' 1' ou est-ce le module 'time' comme dans' import time'? Il semble bizarre d'utiliser un module comme ça, donc je vérifie juste. – mdw7326

+2

Trouvé cela sur Google et avait la même question ainsi décidé je contribuerais. c'est des fractions de seconde. Donc 'stop_event.wait (1)' est 1 seconde. –

9

Si vous voulez que les fils d'arrêter quand vous sortez de programme (comme le laisse entendre votre exemple), puis faites-les daemon threads.

Si vous voulez que vos threads meurent sur commande, vous devez le faire à la main. Il existe différentes méthodes, mais toutes impliquent de faire une vérification dans la boucle de votre thread pour voir s'il est temps de quitter (voir l'exemple de Nix).

Questions connexes