[python]stop threading.timer
Résolu
teebo
Messages postés
33570
Statut
Modérateur
-
Obeet Messages postés 1766 Statut Modérateur -
Obeet Messages postés 1766 Statut Modérateur -
Salut tout le monde,
J'utilise des timers dans mon application (threading.timer), quand l'application (wxWidget) se ferme, je fais un .cancel() sur ces timers, mais ils continuent de vivre jusqu'à la fin de leur compte à rebours (ce qui peut durer plusieurs minutes). Pendant ce temps là, la fenêtre de l'appli est bien fermée mais l'application tourne encore.
Qu'est ce que je pourrai faire pour les "tuer" définitivement?
A moins qu'il faille arrêter l'application wx.App et pas seulement la fenêtre mais je croyais que c'était censé être automatique.
Merci ...
PS: Python2.4, pas essayé avec 2.5...
J'utilise des timers dans mon application (threading.timer), quand l'application (wxWidget) se ferme, je fais un .cancel() sur ces timers, mais ils continuent de vivre jusqu'à la fin de leur compte à rebours (ce qui peut durer plusieurs minutes). Pendant ce temps là, la fenêtre de l'appli est bien fermée mais l'application tourne encore.
Qu'est ce que je pourrai faire pour les "tuer" définitivement?
A moins qu'il faille arrêter l'application wx.App et pas seulement la fenêtre mais je croyais que c'était censé être automatique.
Merci ...
PS: Python2.4, pas essayé avec 2.5...
6 réponses
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).
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
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question