IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Stopper un thread par un signal


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 30
    Par défaut Stopper un thread par un signal
    Bonjour,
    Après de bonnes heures de lectures et de tests, je bloque sur la methode pour stopper un code qui lui-même a lancé des threads.
    Dans l'exemple ci-dessous, avec un timer pour donner une limitte d'execution, tout se passe bien, le code et ses threads sont correctements stoppés.
    Sans le timer, je ne trouve pas le moyen de stopper tout ceci par un signal (ctrl+c ou kill -15).
    Merci par avance pour votre aide.
    Python 2.4 utilisé sur Debian.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    class agent1(threading.Thread):
    	def __init__(self, nom = ''):
    		threading.Thread.__init__(self)
    		self.nom = nom
    		self._stopevent = threading.Event( )
    		print datetime.datetime.now(),"Start",self.nom
    	def run(self):
    		while not self._stopevent.isSet():
    			self._stopevent.wait(10 - (int(time.time()) % 10))
    			print datetime.datetime.now(),"Run",self.nom
    			## doing my job
    	def stop(self):
    		print datetime.datetime.now(),"Stop",self.nom
    		self._stopevent.set( )
     
     
    class agent2(threading.Thread):
    	def __init__(self, nom = ''):
    		threading.Thread.__init__(self)
    		self.nom = nom
    		self._stopevent = threading.Event( )
    		print datetime.datetime.now(),"Start",self.nom
    	def run(self):
    		while not self._stopevent.isSet():
    			self._stopevent.wait(20 - (int(time.time()) % 20))
    			print datetime.datetime.now(),"Run",self.nom
    			## doing my job
    	def stop(self):
    		print datetime.datetime.now(),"Stop",self.nom
    		self._stopevent.set( )
     
     
    def exit(signum,frame):
    	a.stop()
    	b.stop()
    	print datetime.datetime.now(),"Exiting (%d) ..."%(signum)
    	sys.exit(signum)
     
     
    if __name__=="__main__":
    	print datetime.datetime.now(),"Start"
     
    	a = agent1('agent1')
    	b = agent2('agent2')
     
    	signal.signal(signal.SIGTERM, exit)
    	signal.signal(signal.SIGINT, exit)
     
    	a.start()
    	b.start()
     
    	#time.sleep(60.0)
    	#a.stop()
    	#b.stop()

  2. #2
    Membre averti
    Inscrit en
    Février 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 30
    Par défaut
    Voici les modifications apportées pour que le CTRL+C ainsi que le kill -15 fonctionnent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    if __name__=="__main__":
    	signal.signal(signal.SIGTERM, exit)
    	signal.signal(signal.SIGINT, exit)
     
    	print datetime.datetime.now(),"Start"
     
    	a = agent1('agent1')
    	b = agent2('agent2')
     
    	a.start()
    	b.start()
     
    	while True:
    		continue

  3. #3
    Membre averti
    Inscrit en
    Février 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 30
    Par défaut
    En ajoutant, le code ci-dessus, le thread principal prend 100% du cpu.
    En retirant le code ci-dessus, je ne trouve pas moyen de stopper le programme autrement que par un kill -9.

  4. #4
    Membre averti
    Inscrit en
    Février 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 30
    Par défaut
    Le code final et fonctionnel :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    #!/usr/bin/python2.4
    # -*- coding:Latin-1 -*-
     
    ## ----------------------------------------------------------------------
    ## Modules
    ## ----------------------------------------------------------------------
    import sys
    import signal
    import os
    import threading
    import time
    import datetime
     
     
    ## ----------------------------------------------------------------------
    ## Fonctions
    ## ----------------------------------------------------------------------
    def bye(signum,frame):
    	agent1.stop()
    	agent2.stop()
    	print datetime.datetime.now(),"Exit (%d)"%(signum)
    	sys.exit(signum)
     
     
    ## ----------------------------------------------------------------------
    ## Classes
    ## ----------------------------------------------------------------------
    class myThread(threading.Thread):
    	def __init__(self,myTimer):
    		self.timer = myTimer
    		threading.Thread.__init__(self)
    	def run(self):
    		self.event = threading.Event()
    		print datetime.datetime.now(),"Start",self.getName()
    		while not self.event.isSet():
    			self.event.wait(self.timer - (int(time.time()) % self.timer))
    			print datetime.datetime.now(),"Run",self.getName()
    	def stop(self):
    		print datetime.datetime.now(),"Stop",self.getName()
    		self.event.set()
     
     
    ## ----------------------------------------------------------------------
    ## Main
    ## ----------------------------------------------------------------------
    signal.signal(signal.SIGTERM, bye)
    signal.signal(signal.SIGINT, bye)
     
    print datetime.datetime.now(),"Start"
     
    agent1 = myThread(10)
    agent1.setName('agent1')
    agent1.start()
     
    agent2 = myThread(5)
    agent2.setName('agent2')
    agent2.start()
     
     
    while True:
    	time.sleep(60.0)

  5. #5
    Membre émérite
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Par défaut
    Je tire mon chapeau bien bas l'ami! Tu a résolut ton probleme seul et sans la moindre aide... C'est pas moi qui aurait pu t'en donner
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [TCPServer] Un Thread par connexion ?
    Par kedare dans le forum Ruby
    Réponses: 2
    Dernier message: 24/05/2010, 03h38
  2. Destruction d'un Thread par son ID ?
    Par gregcat dans le forum Delphi
    Réponses: 2
    Dernier message: 07/02/2007, 17h43
  3. Stopper un thread
    Par Tenguryu dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/07/2006, 21h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo