web-dev-qa-db-fra.com

Arrêter un fil après un certain temps

Je cherche à terminer certains threads après un certain temps. Ces threads exécuteront une boucle while infinie et pendant ce temps, ils peuvent caler pendant une période aléatoire importante. Le thread ne peut pas durer plus longtemps que le temps défini par la variable de durée. Comment puis-je faire en sorte qu'après la longueur définie par la durée, les threads s'arrêtent.

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
43
Takkun

Cela fonctionnera si vous ne bloquez pas.

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

import threading
import time

duration = 2

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)
    # stops thread t2
    t2_stop.set()

def thread1(arg1, stop_event):
    while not stop_event.is_set():
        stop_event.wait(timeout=5)

def thread2(arg1, stop_event):
    while not stop_event.is_set():
        stop_event.wait(timeout=5)
104
Nix

Si vous voulez que les threads s'arrêtent à la fin de votre programme (comme l'indique votre exemple), faites-les threads démon .

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 vérifier la boucle de votre thread pour voir s'il est temps de quitter (voir l'exemple de Nix).

10
Seth