Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1547 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  comment killer un thread en python?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

comment killer un thread en python?

n°545322
chriss
Posté le 20-10-2003 à 17:54:25  profilanswer
 

En Java lorsque l'on cree un thread on peut le killer simplement a partir du processus pere.
 
Par contre en python j'ai l'impression que ce n'est pas possible.
Dans http://www.python.org/doc/current/ [...] jects.html, pas la moindre fonction du style killThread.
 
Comment faire pour m'en sortir?
 
merci de vos conseils.
 
 
 
 

mood
Publicité
Posté le 20-10-2003 à 17:54:25  profilanswer
 

n°545328
lorill
Posté le 20-10-2003 à 17:58:26  profilanswer
 

Chriss a écrit :

En Java lorsque l'on cree un thread on peut le killer simplement a partir du processus pere.


sauf que c'est déprécié depuis perpette.
 
tu étends Thread, et tu rajoutes ta fonction pour quitter, ce qui permet d'assurer un état cohérent.

n°545823
chriss
Posté le 21-10-2003 à 09:43:25  profilanswer
 

Tu parles d'une fonction interne a mon thread?  
 
Elle ressemble a quoi cette fonction pour quitter?  
 

n°545825
lorill
Posté le 21-10-2003 à 09:47:20  profilanswer
 

ca depends de ce a quoi ressemble ton thread [:spamafote]
 
exemple :

Code :
  1. class MonThread(Thread):
  2.   def run(self):
  3.     self.running = True
  4.     while self.running:
  5.       #blabla
  6.   def stop(self):
  7.     self.running = False

n°545999
e_esprit
Posté le 21-10-2003 à 11:50:26  profilanswer
 

lorill a écrit :

ca depends de ce a quoi ressemble ton thread [:spamafote]
 
exemple :

Code :
  1. class MonThread(Thread):
  2.   def run(self):
  3.     self.running = True
  4.     while self.running:
  5.       #blabla
  6.   def stop(self):
  7.     self.running = False




 
Ouep !
Faut aussi penser a stocker ces objets Threads quelque part.
Enfin moi c'est comme ca que je fais :)

n°546816
chriss
Posté le 22-10-2003 à 10:13:08  profilanswer
 

Je pense que ton thread reste present quand tu fait comme ca.
sa boucle est arrete mais il continue a etre la.
 
J'ai trouvé une bonne solution a cette adresse:
http://aspn.activestate.com/ASPN/C [...] cipe/65222
 
De cette facon je kill proprement mes threads

n°548274
e_esprit
Posté le 23-10-2003 à 12:42:21  profilanswer
 

Chriss a écrit :

Je pense que ton thread reste present quand tu fait comme ca.
sa boucle est arrete mais il continue a etre la.
 
J'ai trouvé une bonne solution a cette adresse:
http://aspn.activestate.com/ASPN/C [...] cipe/65222
 
De cette facon je kill proprement mes threads
 


Je pense pas...
Puisqu'il quitte la methode run() [:spamafote]


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
n°593892
chaica
Posté le 18-12-2003 à 23:29:26  profilanswer
 

Salut,
 
Je rallume ce topic car je bute précisément sur ce problème.
 
J'ai une thread qui tourne en while 1 donc je ne peux pas déclencher d'action à partir d'elle, il faudrait que je la kill de la thread principale et je vois pas trop comment m'y prendre.
 
merci d'avance

n°593897
Taz
bisounours-codeur
Posté le 18-12-2003 à 23:34:24  profilanswer
 

toutes façons c'est chiant de pas pouvoir tuer, si ton bordel est bloqué (attente de ressource : E/S, verrou, etc), t'es bien dans la merde
 
pthread_cancel :love:

n°593905
chaica
Posté le 18-12-2003 à 23:40:15  profilanswer
 

En effet c'est chiant qu'il n'y ait pas de moyen simple pour faire ça.

mood
Publicité
Posté le 18-12-2003 à 23:40:15  profilanswer
 

n°593906
Taz
bisounours-codeur
Posté le 18-12-2003 à 23:40:46  profilanswer
 

y a pas de moyen du tout en fait

n°593908
chaica
Posté le 18-12-2003 à 23:42:42  profilanswer
 

C'est ce que j'étais entrain de comprendre là.

n°593914
Taz
bisounours-codeur
Posté le 18-12-2003 à 23:53:12  profilanswer
 

moi aussi je trouve ça dommage. quand on voit l'intelligence des pthread notemment avec la gestion des points d'interruption, les routines de nettoyage, c'est une véritable régression.

n°593921
chaica
Posté le 19-12-2003 à 00:02:41  profilanswer
 

Mais mon problème est vraiment bizarre. Le fait que je ne puisse pas killer cette thread fait que à la destruction de l'objet dans lequel est crée la thread, mon __del__ ne se lance pas.  Ca marche très bien si je ne lance pas la thread.

n°593923
Taz
bisounours-codeur
Posté le 19-12-2003 à 00:05:34  profilanswer
 

c'est normal. donne le code quand même.

n°593927
verdoux
And I'm still waiting
Posté le 19-12-2003 à 00:12:36  profilanswer
 

Sans compter que l'interpréteur CPython (je ne sais pas pour Jython) a un "global lock", c'est à dire que 2 threads python ne s'exécutent pas vraiment concurremment, même sur machine multi-CPU. (Sauf lors des appels à des fonctions natives non interprétées si le mutex est lâché)


Message édité par verdoux le 19-12-2003 à 00:12:56
n°593928
chaica
Posté le 19-12-2003 à 00:12:40  profilanswer
 

J'ai reproduit le problème ici :  
 

Code :
  1. #!/usr/bin/python
  2. import thread
  3. import time
  4. class Prout:
  5. def __init__(self):
  6.  nothing =()
  7.  print 'prout'
  8.  thread1 = thread.start_new_thread(self.fonc,nothing)
  9. def __del__(self):
  10.  print 'goodbye!'
  11. def fonc(self):
  12.  while(1):
  13.   time.sleep(1)
  14.   print "yo"
  15. pr = Prout()
  16. time.sleep(5)
  17. del pr


 
le destructeur ne s'execute pas.


Message édité par chaica le 19-12-2003 à 00:14:31
n°593930
Taz
bisounours-codeur
Posté le 19-12-2003 à 00:15:44  profilanswer
 

1) utilise threading
2) c'est normal, del n'appelle __del__ que si il n'y a plus de référence. or ici, le thread référence ton Prout via self.fonc

n°593931
chaica
Posté le 19-12-2003 à 00:19:56  profilanswer
 

1) je vais voir ça
2) yep je suspectais cette finesse.
3) bon c'est chiant, faut que je trouve une feinte... :)

n°594009
e_esprit
Posté le 19-12-2003 à 10:32:26  profilanswer
 

Perso je trouve que c'est plus propre de passer par un héritage Thread, mais bon...
Sinon Taz a raison pour le problème de référence.
Une soluce possible :

Code :
  1. import thread
  2. import time
  3. class Prout:
  4.     def __init__(self):
  5.         nothing =()
  6.         self.continu = True
  7.         print 'prout'
  8.         thread1 = thread.start_new_thread(self.fonc,nothing)
  9.     def stop(self):
  10.         self.continu = False       
  11.        
  12.     def __del__(self):
  13.         print 'goodbye!'
  14.        
  15.     def fonc(self):
  16.         while(self.continu):
  17.             time.sleep(1)
  18.             print "yo"
  19.      
  20. pr = Prout()
  21. time.sleep(5)
  22. pr.stop()
  23. time.sleep(2)
  24. del pr


 
le time.sleep(2) est la pour compenser le time.sleep(1) dans fonc() qui empeche le thread de se terminer avant l'appel a del

n°594162
Taz
bisounours-codeur
Posté le 19-12-2003 à 13:37:09  profilanswer
 

pas la peine de mettre le del ...

n°594215
e_esprit
Posté le 19-12-2003 à 14:47:12  profilanswer
 

Bah si, c'est pour illustrer que l'appel a del est pris en compte lorsque le thread est sorti de sa boucle...

n°594352
Taz
bisounours-codeur
Posté le 19-12-2003 à 18:16:25  profilanswer
 

e_esprit a écrit :

Bah si, c'est pour illustrer que l'appel a del est pris en compte lorsque le thread est sorti de sa boucle...

bah quand l'interprétyeur termine, il détruit le thread

n°594997
e_esprit
Posté le 20-12-2003 à 23:13:26  profilanswer
 

Je parle pas de la destruction effective du thread mais de l'appel a __del__


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
n°594998
Taz
bisounours-codeur
Posté le 20-12-2003 à 23:16:06  profilanswer
 

et quoi ?
lis la documentation du gc, vois le fonctionnement de del

n°595053
e_esprit
Posté le 21-12-2003 à 12:10:41  profilanswer
 

:heink: je crois que t'as pas bien compris ce que je disais...
L'exemple fourni illustre ce que tu disais :

Citation :

1) utilise threading
2) c'est normal, del n'appelle __del__ que si il n'y a plus de référence. or ici, le thread référence ton Prout via self.fonc


Alors faut pas s'ennerver, hein... reste zen !


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
n°595063
Taz
bisounours-codeur
Posté le 21-12-2003 à 12:57:06  profilanswer
 

moi je comprends pas ce dont tu parles

n°595134
e_esprit
Posté le 21-12-2003 à 15:40:43  profilanswer
 

Bah relis a partir de la
Apres si tu comprends toujours pas, je peux plus rien pour toi...


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
n°595136
Taz
bisounours-codeur
Posté le 21-12-2003 à 15:43:07  profilanswer
 

garbage
    A list of objects which the collector found to be unreachable but could not be freed (uncollectable objects). By default, this list contains only objects with __del__() methods.3.1Objects that have __del__() methods and are part of a reference cycle cause the entire reference cycle to be uncollectable, including objects not necessarily in the cycle but reachable only from it. Python doesn't collect such cycles automatically because, in general, it isn't possible for Python to guess a safe order in which to run the __del__() methods. If you know a safe order, you can force the issue by examining the garbage list, and explicitly breaking cycles due to your objects within the list. Note that these objects are kept alive even so by virtue of being in the garbage list, so they should be removed from garbage too. For example, after breaking cycles, do del gc.garbage[:] to empty the list. It's generally better to avoid the issue by not creating cycles containing objects with __del__() methods, and garbage can be examined in that case to verify that no such cycles are being created.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  comment killer un thread en python?

 

Sujets relatifs
comment importer dynamiquement un nouveau module dans un prog python?[python] un chtit debut besoin d'aide !
[windows thread/processes] Le Sleep sous windows n'est pas précis.[thread/linux/c++/kdevelop3.1] Problème avec les threads
appli python invisible dans le centre de la barre de taches windows?Faire marcher Thread (une JProgressbar ou une Jmonitorbar)
killer une apli w32et la redemarrer juste apres à intervalle reguliers[Python] Petite difficulté pour moi.
comment faire un "read(mavar)" en python[python] Comment balancer des données dans la mémoire tampon ?
Plus de sujets relatifs à : comment killer un thread en python?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR