[python]stop threading.timer
Résolu/Fermé
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
-
24 nov. 2006 à 07:45
Obeet Messages postés 1766 Date d'inscription mercredi 13 octobre 2004 Statut Modérateur Dernière intervention 17 novembre 2010 - 24 nov. 2006 à 21:33
Obeet Messages postés 1766 Date d'inscription mercredi 13 octobre 2004 Statut Modérateur Dernière intervention 17 novembre 2010 - 24 nov. 2006 à 21:33
6 réponses
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
24 nov. 2006 à 09:41
24 nov. 2006 à 09:41
J'ai ce même de problème avec webGobbler (avec des threads qui font des accès réseau).
Et le comportement de mon appli est le même: ma fenêtre disparaît, et j'ai l'appli qui reste encore un peu le temps que les connexions réseau tombent en timeout.
J'ai fait de nombreuses recherches sur internet: Il semble qu'il n'est pas possible, en Python, de tuer un thread.
Je te conseillerais de développer toi-même une classe thread timer que tu puisse canceller à volonté
(Dans webGobbler, j'utilise un objet Queue (thread-safe) pour communiquer entre mes threads: Pour demander à un thread de s'arrêter, je dépose un objet "Stop" dans sa Queue ; Chaque thread vient lire sa Queue régulièrement (1 fois par seconde).
Tu pourrais utiliser ce genre de méthode pour créer un timer qu'on peut canceller.)
Un autre solution peut-être un peu plus bourrin serait d'envoyer un signal à ton application (genre kill). (à tester).
Et le comportement de mon appli est le même: ma fenêtre disparaît, et j'ai l'appli qui reste encore un peu le temps que les connexions réseau tombent en timeout.
J'ai fait de nombreuses recherches sur internet: Il semble qu'il n'est pas possible, en Python, de tuer un thread.
Je te conseillerais de développer toi-même une classe thread timer que tu puisse canceller à volonté
(Dans webGobbler, j'utilise un objet Queue (thread-safe) pour communiquer entre mes threads: Pour demander à un thread de s'arrêter, je dépose un objet "Stop" dans sa Queue ; Chaque thread vient lire sa Queue régulièrement (1 fois par seconde).
Tu pourrais utiliser ce genre de méthode pour créer un timer qu'on peut canceller.)
Un autre solution peut-être un peu plus bourrin serait d'envoyer un signal à ton application (genre kill). (à tester).
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 793
24 nov. 2006 à 10:28
24 nov. 2006 à 10:28
J'aurai pensé quand même que le cancel faisait ce genre de chose... :-/
J'ai aussi essayé le ExitMainLoop mais ça ne marche pas mieux...
Le problème du signal c'est qu'il est pas forcément multi-plateforme. Théoriquement à ce moment là je peux me permettre d'être bourrin (tout est arrêter proprement, sauf ces timers à la con...)
Dis tu debug avec quel outil toi? Parce que là j'en suis toujours à debugger avec des prints.
Merci
J'ai aussi essayé le ExitMainLoop mais ça ne marche pas mieux...
Le problème du signal c'est qu'il est pas forcément multi-plateforme. Théoriquement à ce moment là je peux me permettre d'être bourrin (tout est arrêter proprement, sauf ces timers à la con...)
Dis tu debug avec quel outil toi? Parce que là j'en suis toujours à debugger avec des prints.
Merci
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
24 nov. 2006 à 10:46
24 nov. 2006 à 10:46
J'utilise le module logging, et chaque message émis par un thread contient l'identifiant du thread.
Comme ça je vois qui fait quoi, qui envoie un message à qui, etc.
https://docs.python.org/3/library/logging.html
(instancié dans le main):
...
handler.setFormatter(logging.Formatter('[%(thread)d] %(name)s: %(message)s'))
logging.getLogger().addHandler(handler)
...
Ensuite je l'utilise dans chaque classe dérivant de threading:
logging.getLogger(self.name).info(message)
(on pourrait aussi utiliser self.__class__ pour obtenir le nom de la classe)
Ce qui me donne des logs du genre:
Les numéros entre crochets sont les identifiants de thread.
Comme ça je vois qui fait quoi, qui envoie un message à qui, etc.
https://docs.python.org/3/library/logging.html
(instancié dans le main):
...
handler.setFormatter(logging.Formatter('[%(thread)d] %(name)s: %(message)s'))
logging.getLogger().addHandler(handler)
...
Ensuite je l'utilise dans chaque classe dérivant de threading:
logging.getLogger(self.name).info(message)
(on pourrait aussi utiliser self.__class__ pour obtenir le nom de la classe)
Ce qui me donne des logs du genre:
[2448] collector_yahooimagesearch: http://www.pearl-of-wisdom.com/images/toy4.jpg [3088] collector_flickr: Querying 'toy toys' [2312] collector_googleimages: http://www.germes-online.com/direct/dbimage/50215787/Toy_Car.jpg [2312] collector_googleimages: Querying 'toy toys' [2232] collector_askjeevesimages: Stopped [2700] collector_deviantart: list index out of range Traceback (most recent call last): File "webgobbler.py", line 1865, in run File "webgobbler.py", line 2114, in _getRandomImage File "C:\Python24\Lib\random.py", line 249, in choice IndexError: list index out of range [2700] collector_deviantart: Stopped [2312] collector_googleimages: Stopped [3088] collector_flickr: Stopped [2448] collector_yahooimagesearch: Stopped [2664] imagepool: Using images in C:\Program Files\webGobbler\imagepool [2664] assembler_superpose: Starting from previous image. [3796] assembler_superpose: Shutting down [2688] imagepool: Shutting down [2700] collector_deviantart: Shutting down. [2312] collector_googleimages: Shutting down. [2232] collector_askjeevesimages: Shutting down. [2448] collector_yahooimagesearch: Shutting down. [3088] collector_flickr: Shutting down.
Les numéros entre crochets sont les identifiants de thread.
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 793
24 nov. 2006 à 10:50
24 nov. 2006 à 10:50
D'accord, merci...
Tu n'utilises pas un debugger non plus...
Tu n'utilises pas un debugger non plus...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
24 nov. 2006 à 10:56
24 nov. 2006 à 10:56
Non pas de debugger.
Obeet
Messages postés
1766
Date d'inscription
mercredi 13 octobre 2004
Statut
Modérateur
Dernière intervention
17 novembre 2010
30
24 nov. 2006 à 21:33
24 nov. 2006 à 21:33
Mouarf, je suis con, en fait il fallait que je refoute n'importe quoi dans ma Queue histoire que les threads fasse une boucle jusqu'a arriver a mon test!