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 :

time sleep(-1) ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 252
    Par défaut time sleep(-1) ?
    Bonjour
    est-ce que time.sleep(-1) lance un process qui ne se termine jamais? j'ai besoin d'un thread qui attend un temps variable, ou n'attend pas et ne fais rien, je voulais mettre alors des temps negatifs pour ça mais ça n'a pas l'air interressant

    je voudrais pouvoir changer ce temps et en le mettant negatif par exemple le thread se met en pause

    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
    import threading
    import time
     
    class timeout(threading.Thread):
        def __init__(self, rate = 60):
            threading.Thread.__init__(self)
            self.rate = rate
            self.stopped=False
        def run(self):
            while self.rate>0:
                print self.rate, time.time()
                time.sleep(self.rate)
            self.stopped=True
            print "timeout end"
        def setrate(self, rate):
            self.rate = rate 
            if self.stopped:
                print "timeout restart"
                self.start()  
     
    class changer(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
        def run(self):
            time.sleep(10)
            global tout
            tout.setrate(2)
            time.sleep(10)
            tout.setrate(-1)
            time.sleep(10)
            tout.setrate(5)
            print "changer" 
     
     
    global tout       
    tout=timeout(5)
    tout.start()
    changer().start()
    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
    5 1290776845.79
    5 1290776850.8
    5 1290776855.8
    2 1290776860.8
    2 1290776862.8
    2 1290776864.81
    timeout end
    timeout restart
    Exception in thread Thread-2:
    Traceback (most recent call last):
      File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
        self.run()
      File "test.py", line 31, in run
        tout.setrate(5)
      File "test.py", line 19, in setrate
        self.start()
      File "/usr/lib/python2.6/threading.py", line 467, in start
        raise RuntimeError("thread already started")
    RuntimeError: thread already started

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Par défaut
    Bonjour,
    Franchement c'est pas très clair.
    Pour le time.sleep(-1), à moins que tu veuilles faire une application qui remonte le temps, ça me semble un peu bizarre.

    j'ai besoin d'un thread qui attend un temps variable, ou n'attend pas et ne fais rien
    On croirait une devise shadock.
    A quoi sert quelque chose qui n'attend pas et qui ne fait rien? autant ne rien faire.

    Je pense qu'il va falloir donner plus d'explication si tu veux que quelqu'un d'aide.

    Sinon, ton message d'erreur vient du faite que tu relances le thread déjà lancé, à la fin de la méthode setrate. Si tu veux le relancer il faut d'abord le stopper, c'est à dire que l'exécution du code se finisse.
    Ensuite les variables globales sont à proscrire en POO. Tu peux passer l'instance de timeout en argument de changer, pour y accéder.
    Il est également recommandé de mettre des majuscule aux noms de classes.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 252
    Par défaut
    bon il me faut un thread qui fait une tache tous les rate secondes
    et j'ai une autre classe capable de changer le rate par setrate, je voudrais qu'on puisse mettre un rate de 10s, 15s ou un rate de -1 de façon à ce que la tache s'arrete momentanément jusqu'a ce que on lui remette en rate >0

    Citation Envoyé par nyko77 Voir le message
    Sinon, ton message d'erreur vient du faite que tu relances le thread déjà lancé, à la fin de la méthode setrate. Si tu veux le relancer il faut d'abord le stopper, c'est à dire que l'exécution du code se finisse.
    "timemout end" montre que run s'est terminé, je vois pas comment le relancer sans avoir cette erreur

    Citation Envoyé par nyko77 Voir le message
    Ensuite les variables globales sont à proscrire en POO. Tu peux passer l'instance de timeout en argument de changer, pour y accéder.
    .
    ok

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tout d'abord, changer la valeur de time.sleep() pendant qu'il s'exécute, me parait hautement improbable.

    Je vais tester ça, ça m'intrigue.

    Pour ton problème de tâche, je pense que tu te faciliterais la vie en créant une nouvelle instance du thread à chaque changement de rate.

    Avec threading.enumerate() tu pourras contrôler les process en vie et tu verras qu'il n'y a aucun risque d'emballement démographique, les threads ayant accomplit leur tâche disparaissent directement de la liste.

  5. #5
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    J'ai modifié ton code pour tester la chose :

    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
     
    import threading
    import time
     
    class timeout(threading.Thread):
        def __init__(self, rate = 60):
            threading.Thread.__init__(self)
            self.rate = rate
     
        def run(self):
            print self.rate, time.time()
            time.sleep(self.rate)
            print "timeout end", time.time()
     
        def setrate(self, rate):
            self.rate = rate   
     
    class changer(threading.Thread):
        def __init__(self, tout):
            threading.Thread.__init__(self)
            self.tout = tout
     
        def run(self):
            time.sleep(2)
            self.tout.setrate(2)
     
    tout = timeout(10)
    tout.start()
    ch = changer(tout)
    ch.start()
    Je confirme, c'est absolument sans effet.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 252
    Par défaut
    ok c'est un peu ça que je voulais faire: mais c'est un exemple extrait du reste il faut que l'inclue maintenant merci
    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
    import threading
    import time
     
    class Timeout(threading.Thread):
        def __init__(self, rate = 60):
            threading.Thread.__init__(self)
            self.rate = rate
            self.stopped=False
        def run(self):
            while self.rate>0:
                print " ",self.rate, time.time(), threading.enumerate()
                time.sleep(self.rate)
            self.stopped=True
            print "timeout ", self.__str__(), "end"
        def setrate(self, rate):
            self.rate = rate
        def isstopped(self):
            return self.stopped
     
     
    class Changerate(threading.Thread):
        def __init__(self, timeoutthread):
            threading.Thread.__init__(self)
            self.timeouthread=timeoutthread
        def run(self):
            time.sleep(10)
            self.timeouthread.setrate(1)
            print "1", self.timeouthread.isAlive(),self.timeouthread.isstopped()
            if self.timeouthread.isstopped():
                self.timeouthread=Timeout(self.timeouthread.rate)
                self.timeouthread.start()
            time.sleep(10)
            self.timeouthread.setrate(0)
            print "2", self.timeouthread.isAlive(),self.timeouthread.isstopped()
            if self.timeouthread.isstopped():
                self.timeouthread=Timeout(self.timeouthread.rate)
                self.timeouthread.start()
            time.sleep(10)
            self.timeouthread.setrate(3)
            print "3", self.timeouthread.isAlive(),self.timeouthread.isstopped()
            if self.timeouthread.isstopped():
                self.timeouthread=Timeout(self.timeouthread.rate)
                self.timeouthread.start()
            time.sleep(10)
            self.timeouthread.setrate(1)
            print "4", self.timeouthread.isAlive(),self.timeouthread.isstopped()
            if self.timeouthread.isstopped():
                self.timeouthread=Timeout(self.timeouthread.rate)
                self.timeouthread.start()
     
     
     
    tout=Timeout(2)
    tout.start()
     
    Changerate(tout).start()
     
    print "0", threading.enumerate()

Discussions similaires

  1. [Python 2.X] [Un petit coup de pouce ]Actualisation + time.sleep
    Par lyonsauvage dans le forum Général Python
    Réponses: 5
    Dernier message: 06/05/2015, 07h33
  2. Mise à jours label pour chronomètre après time.sleep()
    Par Mat08 dans le forum GTK+ avec Python
    Réponses: 2
    Dernier message: 08/01/2015, 23h19
  3. time.sleep bloque le programme
    Par laloibibi dans le forum Général Python
    Réponses: 6
    Dernier message: 25/04/2014, 14h27
  4. [time.h]... sleep()
    Par _matt_44 dans le forum C
    Réponses: 8
    Dernier message: 29/03/2006, 11h35
  5. time.sleep() ne fonctionne pas comme souhaité
    Par Olivier_ dans le forum Général Python
    Réponses: 3
    Dernier message: 19/11/2005, 01h46

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