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 :

mettre un thread en pause


Sujet :

Python

  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 50
    Points
    50
    Par défaut mettre un thread en pause
    bonjour,
    j'ai un thread qui execute plusieurs instructions.j'aimerais bien faire une pause et reprendre mon thread de là ou je me suis arrêté.pour ce faire,je dois implémenter 2 fonctions:une methode qui met mon thread en pause tout en sauvegardant le contexte et une autre play qui load mon thread et continue son execution de là ou je me suis arrêté la dernière fois.
    j'ai tellement cherché mais j'ai pas trouvé la solution.j'ai essayé avec les threading.event ça marche pas non plus.
    svp si quequ'un pourrais m'aider..
    merci d'avance

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 140
    Points : 182
    Points
    182
    Par défaut
    Bonjour,

    je me dis que tu peux peut etre mettre un peu de code qui ressemble à ca au bon endroit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [blablabla]
    while maConditionDodo:
      time.sleep(maDuree)
    [blablabla]

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans la mesure ou le travail du thread se trouve dans une boucle, voilà un exemple de ce qu'on pourrait faire pour la pause avec time.sleep()(Python 2.7):

    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
    63
    import threading
    import time
     
    ##############################################################################
    class Monthread(threading.Thread):
     
        def __init__(self):
            threading.Thread.__init__(self)
            self.encore = True # =variable pour arrêter le thread sur demande
            self.enpause = False # variable pour mettre le thread en pause
     
            self.c = 0 # simple compteur pour affichage
     
        def run(self):
     
            while self.encore:
     
                while self.enpause:
                    time.sleep(0.5)
     
                # activité du thread
                # ...
                self.c += 1
                print self.c
                # ...
     
        def pause(self):
            self.enpause = True
     
        def reprise(self):
            self.enpause = False
     
        def stop(self):
            self.encore = False
     
    ##############################################################################
     
    app=Monthread()
    app.start()
     
    print u"thread lancé"
     
    tps = time.time()
     
    while app.isAlive():
        if time.time()-tps > 1: # pause du thread au bout de 1 secondes
            app.pause()
            print u"thread en pause"
            break
     
    while app.isAlive():
        if time.time()-tps > 2: # reprise du thread au bout de 2 secondes
            print u"reprise du thread"
            app.reprise()
            break 
     
    while app.isAlive():
        if time.time()-tps > 3: # arrêt du thread au bout de 3 secondes
            app.stop() 
            print u"arrêt du thread"
            break
     
    print "fin"
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    je crois que le PO veut stopper le thread pour le reprendre à la prochaine exécution du code.

  5. #5
    Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par josmiley Voir le message
    je crois que le PO veut stopper le thread pour le reprendre à la prochaine exécution du code.
    oui je conte faire ça.mais le problème comment procéder pour le faire

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bizarre, j'avais cru répondre à la question: un thread actif qu'on met en pause et qu'on fait reprendre à la demande.

    En quoi la solution proposée ne convient pas?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Il faudrait clarifier, montrer un exemple de ce que signifie:
    Citation Envoyé par stoner2008
    j'ai un thread qui execute plusieurs instructions
    Par défaut, un thread exécute l'appel de la fonction qui lui aura été passée en argument dans un contexte "particulier".
    Lorsque la fonction se termine, la thread se termine.

    Il faudrait aussi préciser ce que signifient: suspendre et reprendre.

    Si l'exemple de Tyrtamos ne convient pas, on peut imaginer "suspendre" comme sauvegardant suffisamment d'informations sur le "contexte" pour pouvoir "reprendre" après le reboot du système ou sur un autre système.
    Ce n'est pas impossible mais pas avec seulement des threads!!!

    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Il faudrait clarifier, montrer un exemple de ce que signifie:


    Par défaut, un thread exécute l'appel de la fonction qui lui aura été passée en argument dans un contexte "particulier".
    Lorsque la fonction se termine, la thread se termine.

    Il faudrait aussi préciser ce que signifient: suspendre et reprendre.

    Si l'exemple de Tyrtamos ne convient pas, on peut imaginer "suspendre" comme sauvegardant suffisamment d'informations sur le "contexte" pour pouvoir "reprendre" après le reboot du système ou sur un autre système.
    Ce n'est pas impossible mais pas avec seulement des threads!!!

    Cordialement,
    - W
    et bien normalent je lance un thread pour une session de test.et bien je voudrais créé une fonction qui met en pause ma session de test.et puis je serai en mesure de reprendre ma session de test de là ou on s'etait arrêté la dernière fois.c est pour ça que je dois implémenter deux fonctions: une pour suspendre ma session et l'autre pour continuer.pour chaque session de test on à un thread pour pouvoir lancer différents sessions à la fois

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    et bien normalent je lance un thread pour une session de test.et bien je voudrais créé une fonction qui met en pause ma session de test
    Vous parliez "d'instructions" maintenant vous introduisez "session".
    Faut-il comprendre "session" comme suite "d'instructions" exécutées par un(des) thread(s) jouant le rôle de "processeur" (de test)?

    Par exemple, avec unittest une session de tests pourrait être la suite de "test cases" associée à une "test suite".

    Le thead pourrait être associée à une "test suite" et "suspendre/reprendre" pourrait se traduire par un état "fait/à faire" associé aux différents "test cases" de la "test suite".

    Mais "je conjecture" pour illustrer que sans plus de précisions sur la nature des objets dont vous parlez je ne comprend même pas pourquoi vous utilisez des threads!
    Pourquoi ne pas tout mettre dans une Virtual Machine et d'appliquer "suspendre/reprendre" à la VM...

    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par wiztricks Voir le message

    Par exemple, avec unittest une session de tests pourrait être la suite de "test cases" associée à une "test suite".

    Le thead pourrait être associée à une "test suite" et "suspendre/reprendre" pourrait se traduire par un état "fait/à faire" associé aux différents "test cases" de la "test suite".


    - W
    tout à fait.j'aimerai faire un truc comme ça.le problème réside dans les fonctions suspendre /reprendre.je ne sais pas comment sauvegarder le contexte d'une session de test et puis quand je reprend mes tests et bien les tests continuent de l'endroi ou je me suis arrété.


    bref c'est comme le phénomène du téléchargement du fichier(avec reprise) ou scanner un pc(antivirus).j'aimerai faire un truc pareil mais pour les tests

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    tout à fait.j'aimerai faire un truc comme ça.le problème réside dans les fonctions suspendre /reprendre.je ne sais pas comment sauvegarder le contexte d'une session de test et puis quand je reprend mes tests et bien les tests continuent de l'endroi ou je me suis arrété.
    Joli projet!

    Sauvegarder signifie écrire l'état courant de la "test suite" dans un "fichier" pour la restaurer plus tard. Comme on ne sait pas trop ce que c'est on supposera que la chose est "pickable".

    Le truc ci dessous booste un peu celui donné par Tyrtamos.

    Les threads sont associées à une suite de callables (les test_cases des test_suite's). Lorsqu'on "pause" un thread, l'event ne sera pris en compte qu'à la fin de l'exécution du test_case en cours (difficile de faire plus fin).
    Après on fait ce qu'on veut de la test_suite.

    Dans l'exemple, je la sérialise l'état de la suite dans un string puis on continue plus tard dans un autre thread après l'avoir dé-serialisée.

    Le but est de "montrer" comment on çà pourrait marcher et/ou quelles fonctionnalités maîtriser pour le faire.
    Note: réalisé "en localisant" un "autre truc" qui traine sur mes disques, je n'ai jamais pris le temps de m'assurer que tout fonctionne dans "l'autre truc".

    Désolé si cela est "ardu".

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    import logging
    logging.basicConfig(level=logging.INFO)
    log = logging.getLogger('test')
     
    import time
    from threading import Thread, Event, Lock
     
    # WorkQ defines an interface.
    class WorkQ(list):
        def pop(self):
            if self:
                return super().pop(0)
        def push(self, target, args=(), kwargs={}):
            super().append( (target, args, kwargs) )
     
        @property
        def size(self):
            return len(self)
     
    IDLE, RUN, PAUSED, SHUT = 'idle', 'run', 'paused', 'shut'
    CPU_STATES = IDLE, RUN, PAUSED, SHUT
     
    class Processor(Thread):
     
        number = 0
        def get_number(self):
            Processor.number += 1
            return Processor.number
     
        def __init__(self, workq):
            self.number = self.get_number()
            self.workq = workq
            super().__init__()
            self._run = Event()
            self._shut = Event()
            self.state = IDLE
            log.debug('created %s' % self)   
     
        def _do_work(self):
            w = self.workq.pop()
            if w:
                target, args, kwds = w
                log.debug('CPU %d starting "%s(%s)"' % (self.number,
                    target.__name__, ', '.join(str(x) for x in args)))
                try:
                    results = target(*args, **kwds)
                except Exception() as e:
                    log.exception('error on "%s"' % target.__name__)
            else:
                self.shut()
     
        def run(self):
            self.state = RUN
            log.debug('%s' % self)
            while not self._shut.is_set():
                if self._run.is_set():
                    self.state = PAUSED
                    log.debug('%s' % self)
                    while self._run.is_set():
                        self._run.wait(timeout=0.5)
                    log.debug('%s' % self)
                    self.state = RUN
                else:
                    self._do_work()
            self.state = SHUT
            log.debug('%s' % self)
     
        def pause(self, wait=False):
            log.debug('CPU %d - pausing ' % (self.number))
            if not self._run.is_set():
                self._run.set()
            if wait:
                log.debug('.pause waiting %s' % self)
                self.wait(PAUSED)
     
        def resume(self):
            log.debug('CPU %d - resuming' % (self.number))
            if self._run.is_set():
                self._run.clear()
     
        def shut(self, wait=False):
            log.debug('CPU %d - shutting down' % (self.number))
            if not self._shut.is_set():
                self._shut.set()
                if self.state is PAUSED:
                    self.resume()
            if wait:
                log.debug('.shut waiting %s' % self)
                self.wait(SHUT)
     
        def wait(self, state):
            assert state in CPU_STATES
            while self.state not in (state, SHUT):
                log.debug('wait cpu %s for %s' % (state, self))
                time.sleep(0.5)
     
        def __str__(self):
            return 'CPU %d - state: %s' % (self.number, self.state)
     
    if __name__ == '__main__':
     
        import pickle # to serialize suites...
        # mock test case as "callables"
        def test_case(name, counter):
            while counter > 0:
                print ('%s: counter= %d' % (name, counter))
                counter -= 1
                time.sleep(0.2)
     
        # mock test suite as WorkQ"
        class TestSuite(WorkQ):
            def __init__(self, name):
                super().__init__()
                self.name = name
            def __str__(self):
                return 'TestSuite(%s), left: %d' % (self.name, self.size)
        # build two test suite    
        suites = [ TestSuite('suite-%d' % x) for x in range(2) ]
        for s in suites:
            for _ in range(3):
                s.push(test_case, ('%s, case: %d' % (s.name, _), 5))
     
        log.info('creating processors')        
        cpu = [ Processor(w) for  w in suites ]
        for _ in cpu: _.start()
     
        # our victim
        p = cpu[0]
        log.info('pausing cpu 0')    
        p.pause(wait=True)
     
        # fetch workq
        wq = p.workq
        log.info('dumping state: %s' % wq.name)    
        wq_state = pickle.dumps(wq)
     
        log.info('shutting down CPU %d' % p.number)    
        p.shut(wait=True)
        cpu.remove(p)
     
        log.info('pausing %s' % wq.name)
        count = 100              # show that other tasks are
        delay = 2.0 / count      # running while we're pausing.
        while count > 0:
            time.sleep(delay)
            count -= 1
     
        log.info('reloading state')    
        wq = pickle.loads(wq_state)
     
        log.info('reloaded state: %s' % wq.name)
        log.info('creating new CPU/thread')
        p = Processor(wq)
        cpu.append(p)
        p.start()
        log.info('restarting...')
        p.wait(RUN)
     
        log.info('waiting completion')
        for _ in cpu: _.join()
    En sortie, j'obtiens:
    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
    INFO:test:creating processors
    suite-0, case: 0: counter= 5
    suite-1, case: 0: counter= 5
    INFO:test:pausing cpu 0
    suite-0, case: 0: counter= 4
    suite-1, case: 0: counter= 4
    suite-0, case: 0: counter= 3
    suite-1, case: 0: counter= 3
    suite-0, case: 0: counter= 2
    suite-1, case: 0: counter= 2
    suite-0, case: 0: counter= 1
    suite-1, case: 0: counter= 1
    INFO:test:dumping state: suite-0
    INFO:test:shutting down CPU 1
    suite-1, case: 1: counter= 5
    suite-1, case: 1: counter= 4
    suite-1, case: 1: counter= 3
    INFO:test:pausing suite-0
    suite-1, case: 1: counter= 2
    suite-1, case: 1: counter= 1
    suite-1, case: 2: counter= 5
    suite-1, case: 2: counter= 4
    suite-1, case: 2: counter= 3
    suite-1, case: 2: counter= 2
    suite-1, case: 2: counter= 1
    INFO:test:reloading state
    INFO:test:reloaded state: suite-0
    INFO:test:creating new CPU
    suite-0, case: 1: counter= 5
    INFO:test:restarting...
    INFO:test:waiting completion
    suite-0, case: 1: counter= 4
    suite-0, case: 1: counter= 3
    suite-0, case: 1: counter= 2
    suite-0, case: 1: counter= 1
    suite-0, case: 2: counter= 5
    suite-0, case: 2: counter= 4
    suite-0, case: 2: counter= 3
    suite-0, case: 2: counter= 2
    suite-0, case: 2: counter= 1
    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,




    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    import logging
    logging.basicConfig(level=logging.INFO)
    log = logging.getLogger('test')
     
    import time
    from threading import Thread, Event, Lock
     
    # WorkQ defines an interface.
    class WorkQ(list):
        def pop(self):
            if self:
                return super().pop(0)
        def push(self, target, args=(), kwargs={}):
            super().append( (target, args, kwargs) )
     
        @property
        def size(self):
            return len(self)
     
    IDLE, RUN, PAUSED, SHUT = 'idle', 'run', 'paused', 'shut'
    CPU_STATES = IDLE, RUN, PAUSED, SHUT
     
    class Processor(Thread):
     
        number = 0
        def get_number(self):
            Processor.number += 1
            return Processor.number
     
        def __init__(self, workq):
            self.number = self.get_number()
            self.workq = workq
            super().__init__()
            self._run = Event()
            self._shut = Event()
            self.state = IDLE
            log.debug('created %s' % self)   
     
        def _do_work(self):
            w = self.workq.pop()
            if w:
                target, args, kwds = w
                log.debug('CPU %d starting "%s(%s)"' % (self.number,
                    target.__name__, ', '.join(str(x) for x in args)))
                try:
                    results = target(*args, **kwds)
                except Exception() as e:
                    log.exception('error on "%s"' % target.__name__)
            else:
                self.shut()
     
        def run(self):
            self.state = RUN
            log.debug('%s' % self)
            while not self._shut.is_set():
                if self._run.is_set():
                    self.state = PAUSED
                    log.debug('%s' % self)
                    while self._run.is_set():
                        self._run.wait(timeout=0.5)
                    log.debug('%s' % self)
                    self.state = RUN
                else:
                    self._do_work()
            self.state = SHUT
            log.debug('%s' % self)
     
        def pause(self, wait=False):
            log.debug('CPU %d - pausing ' % (self.number))
            if not self._run.is_set():
                self._run.set()
            if wait:
                log.debug('.pause waiting %s' % self)
                self.wait(PAUSED)
     
        def resume(self):
            log.debug('CPU %d - resuming' % (self.number))
            if self._run.is_set():
                self._run.clear()
     
        def shut(self, wait=False):
            log.debug('CPU %d - shutting down' % (self.number))
            if not self._shut.is_set():
                self._shut.set()
                if self.state is PAUSED:
                    self.resume()
            if wait:
                log.debug('.shut waiting %s' % self)
                self.wait(SHUT)
     
        def wait(self, state):
            assert state in CPU_STATES
            while self.state not in (state, SHUT):
                log.debug('wait cpu %s for %s' % (state, self))
                time.sleep(0.5)
     
        def __str__(self):
            return 'CPU %d - state: %s' % (self.number, self.state)
     
    if __name__ == '__main__':
     
        import pickle # to serialize suites...
        # mock test case as "callables"
        def test_case(name, counter):
            while counter > 0:
                print ('%s: counter= %d' % (name, counter))
                counter -= 1
                time.sleep(0.2)
     
        # mock test suite as WorkQ"
        class TestSuite(WorkQ):
            def __init__(self, name):
                super().__init__()
                self.name = name
            def __str__(self):
                return 'TestSuite(%s), left: %d' % (self.name, self.size)
        # build two test suite    
        suites = [ TestSuite('suite-%d' % x) for x in range(2) ]
        for s in suites:
            for _ in range(3):
                s.push(test_case, ('%s, case: %d' % (s.name, _), 5))
     
        log.info('creating processors')        
        cpu = [ Processor(w) for  w in suites ]
        for _ in cpu: _.start()
     
        # our victim
        p = cpu[0]
        log.info('pausing cpu 0')    
        p.pause(wait=True)
     
        # fetch workq
        wq = p.workq
        log.info('dumping state: %s' % wq.name)    
        wq_state = pickle.dumps(wq)
     
        log.info('shutting down CPU %d' % p.number)    
        p.shut(wait=True)
        cpu.remove(p)
     
        log.info('pausing %s' % wq.name)
        count = 100              # show that other tasks are
        delay = 2.0 / count      # running while we're pausing.
        while count > 0:
            time.sleep(delay)
            count -= 1
     
        log.info('reloading state')    
        wq = pickle.loads(wq_state)
     
        log.info('reloaded state: %s' % wq.name)
        log.info('creating new CPU/thread')
        p = Processor(wq)
        cpu.append(p)
        p.start()
        log.info('restarting...')
        p.wait(RUN)
     
        log.info('waiting completion')
        for _ in cpu: _.join()
    En sortie, j'obtiens:
    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
    INFO:test:creating processors
    suite-0, case: 0: counter= 5
    suite-1, case: 0: counter= 5
    INFO:test:pausing cpu 0
    suite-0, case: 0: counter= 4
    suite-1, case: 0: counter= 4
    suite-0, case: 0: counter= 3
    suite-1, case: 0: counter= 3
    suite-0, case: 0: counter= 2
    suite-1, case: 0: counter= 2
    suite-0, case: 0: counter= 1
    suite-1, case: 0: counter= 1
    INFO:test:dumping state: suite-0
    INFO:test:shutting down CPU 1
    suite-1, case: 1: counter= 5
    suite-1, case: 1: counter= 4
    suite-1, case: 1: counter= 3
    INFO:test:pausing suite-0
    suite-1, case: 1: counter= 2
    suite-1, case: 1: counter= 1
    suite-1, case: 2: counter= 5
    suite-1, case: 2: counter= 4
    suite-1, case: 2: counter= 3
    suite-1, case: 2: counter= 2
    suite-1, case: 2: counter= 1
    INFO:test:reloading state
    INFO:test:reloaded state: suite-0
    INFO:test:creating new CPU
    suite-0, case: 1: counter= 5
    INFO:test:restarting...
    INFO:test:waiting completion
    suite-0, case: 1: counter= 4
    suite-0, case: 1: counter= 3
    suite-0, case: 1: counter= 2
    suite-0, case: 1: counter= 1
    suite-0, case: 2: counter= 5
    suite-0, case: 2: counter= 4
    suite-0, case: 2: counter= 3
    suite-0, case: 2: counter= 2
    suite-0, case: 2: counter= 1
    Cordialement,
    - W
    merci je pense que ça sera super utile.

  13. #13
    Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 50
    Points
    50
    Par défaut
    voici mon code

    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
    class king(object):
        def __init__(self, portnb=22222):
            self._states = {}
            self._jobs = dict()
            self.lock = threading.Lock()
            self.should_suspend = threading.Event()
    #--------------------------------------
        def save(self, name, state):
            with self.lock:
                self._states[name] = state
     
        def load(self, name):
            with self.lock:
                return self._states.get(name)
     
     
     
     
        def suspendJob(self,name,):
            self._mainlog.debug('suspending the current job')
            if name in (self._jobs):
                self.should_suspend.set()
                myjob  = self._jobs[name]
                myjob.join()
                print("job", self.name, "saving state:", self.state)
                self.save(self.name, self.state)
                return
                self.state += 1
            else:
                self._mainlog.error("there is no Jobs with this name ")
                return "Bad name"
    la fonction "create"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def createJob (self,name):
            logging.debug('creating a new job')
            job1 = job()
            job1.start()
            job1.setName(name)
            self._jobs[name] = job1
            print self._jobs
            return "Job created"

    et comme résultat j'ai eu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    suspending the current job
    {'task1': <job(task1, started -1221555344)>}
     
    File "/home/workspace/project/king.py", line 112, in suspendJob
        self.save(self.name, self.state)
    AttributeError: 'king' object has no attribute 'name'

    c'est un peu dur pour quelqu'un qui débute en python.je conte sur vous pour m'aider

  14. #14
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Normalement tu aurais dut avoir cette erreur déjà à la ligne précédente

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print("job", self.name, "saving state:", self.state)
    Ce ne serait pas plutot self._jobs[name] à la place de self.name ?

  15. #15
    Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Normalement tu aurais dut avoir cette erreur déjà à la ligne précédente

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print("job", self.name, "saving state:", self.state)
    Ce ne serait pas plutot self._jobs[name] à la place de self.name ?
    je l'ai modifié.j'ai eu ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File "/home/workspace/project/king.py", line 112, in suspendJob
        print("job", self._jobs[name], "saving state:", self.state)
    AttributeError: 'job' object has no attribute 'state'
    non myjob est un job et self apparement refer to job aussi.mais ça ne marche pas

  16. #16
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Ben, c'est difficile à suivre, dans le message précédent self désignait l'instance de king et, dans celui-ci, self désigne un objet job.

    Je suppose qu'il manque des lignes de code dans l'exemple.

    Qu'est-ce que tu appelles sauver ? juste stocker dans une référence ?

  17. #17
    Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 50
    Points
    50
    Par défaut
    j'aimerai sauvegarder l'état de mon job déjà créé avec la méthode create job.je ne sais meme pas comment procéder pour le faire puisque ce code n'est pas fonctionnel

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Lorsque vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            if name in (self._jobs):
                self.should_suspend.set()
                myjob  = self._jobs[name]
                myjob.join()
                print("job", self.name, "saving state:", self.state)
                self.save(self.name, self.state)
                return
                self.state += 1
    Le "job" est à priori myjob et "self" représente l'instance de "king".
    Alors effectivement, les attributs "name" et "state" ne sont pas là...

    Pourtant, le message d'erreur est assez explicite:
    File "/home/workspace/project/king.py", line 112, in suspendJob
    self.save(self.name, self.state)
    AttributeError: 'king' object has no attribute 'name'
    Courage
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  19. #19
    Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par stoner2008 Voir le message
    je l'ai modifié.j'ai eu ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File "/home/workspace/project/king.py", line 112, in suspendJob
        print("job", self._jobs[name], "saving state:", self.state)
    AttributeError: 'job' object has no attribute 'state'
    non myjob est un job et self apparement refer to job aussi.mais ça ne marche pas

  20. #20
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par stoner2008 Voir le message
    non myjob est un job et self apparement refer to job aussi.mais ça ne marche pas
    Essayez d'être plus précis: "myjob" est dans votre tête, il n'est même pas mentionné dans l'erreur remontée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File "/home/workspace/project/king.py", line 112, in suspendJob
        print("job", self._jobs[name], "saving state:", self.state)
    AttributeError: 'job' object has no attribute 'state'
    Comment assurez vous que "job" devrait bien avoir un attribut "state" alors que vous semblez secouer le code dans tous les sens dans l'espoir de le voir tomber en marche?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Mettre le thread GUI en pause
    Par luffydu22 dans le forum Multithreading
    Réponses: 0
    Dernier message: 26/12/2010, 13h41
  2. Mettre un thread en pause!
    Par Voldo dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 29/03/2008, 18h29
  3. Ou mettre le thread ?
    Par Nemesis007 dans le forum Threads & Processus
    Réponses: 26
    Dernier message: 18/02/2007, 15h18
  4. Mettre un SDL_Thread sur pause ?
    Par Franck.H dans le forum SDL
    Réponses: 6
    Dernier message: 14/12/2006, 14h44
  5. mettre un programme en pause
    Par jobherzt dans le forum C++
    Réponses: 16
    Dernier message: 13/07/2006, 20h38

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