47 votes

Arrêt d'un fil de discussion après un certain laps de temps

Je cherche à mettre fin à certains fils de discussion après un certain temps. Ces threads exécutent une boucle while infinie et, pendant ce temps, ils peuvent se bloquer pendant une durée importante et aléatoire. Le fil ne peut pas durer plus longtemps que le temps fixé par la variable duration. Comment puis-je faire en sorte que les threads s'arrêtent après la durée définie par la variable duration ?

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

0 votes

Votre fil va-t-il être bloqué ?

0 votes

Les fils fonctionneront dans une boucle infinie. Il est possible que les threads dorment pendant une durée aléatoire. Les threads ne peuvent absolument pas fonctionner pendant la durée spécifiée au début du programme. Si les threads ne savent pas combien de temps ils ont dormi, comment sauront-ils quand s'arrêter ?

20 votes

Quelqu'un pourrait-il simplement répondre à sa question sans exiger qu'il fasse basculer le monde entier sur son axe ? Il y a d'autres programmeurs comme moi qui ont besoin d'une réponse à cette question, et ils ne peuvent absolument, positivement, pas le faire d'une autre manière (pour le moment).

107voto

Nix Points 22944

Cela va fonctionner si vous ne bloquez pas.

Si vous avez l'intention 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 le "sommeil", il se réveillera. Si vous utilisez time.sleep() votre fil ne s'arrêtera que après il se réveille.

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)

0 votes

Est-ce que le time sur stop_event.wait(time) est censé être une variable numérique comme 1 ou est-ce le time comme dans import time ? Il me semble bizarre d'utiliser un tel module, alors je vérifie simplement.

2 votes

J'ai trouvé ceci sur Google et j'avais la même question, alors j'ai décidé de contribuer. Il s'agit de fractions de seconde. Donc stop_event.wait(1) est de 1 seconde.

0 votes

C'est une réponse parfaite à une question parfaite. Les deux sont extrêmement concis, accessibles et généralisables, et pourtant ils communiquent tous deux une complexité substantielle. Bien joué.

11voto

Seth Points 18568

Si vous voulez que les threads s'arrêtent lorsque votre programme se termine (comme l'implique votre exemple), alors faites en sorte qu'ils soient fils démoniaques .

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

0voto

el ks Points 363

Si vous voulez utiliser une classe :

from datetime import datetime,timedelta

class MyThread(): 

    def __init__(self, name, timeLimit):        
        self.name = name
        self.timeLimit = timeLimit
    def run(self): 
        # get the start time
        startTime = datetime.now()

        while True:
           # stop if the time limit is reached :
           if((datetime.now()-startTime)>self.timeLimit):
               break
           print('A')

mt = MyThread('aThread',timedelta(microseconds=20000))
mt.run()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X