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 :

synchronisatiuon de thread


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 93
    Par défaut synchronisatiuon de thread
    bonjour je cherche synchroniser trois thread le deuxieme doit se lancer apres le premier et le troisieme apres le deuxieme 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
    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
    from random import random
    from time import mktime,localtime,sleep
    from threading import Thread,Timer,Event
    from sys import exit,argv       
    class Loto:
     
        def __init__(self,intloto,lister,intentier,listerentier):
            self.integer=intloto
            self.liste=lister
            self.int=intentier
            self.liste_entier=listerentier
            self.masquer=0
     
        def rdm(self):
     
            for t in range(0,self.integer):
     
                self.liste.insert(0,random())
            print self.liste
            sleep(2)
            self.masquer=1
     
        def wait(self):
            print localtime()
            a=Timer(1,self.rdm,[],{})
            a.start()
     
     
        def afterrdm(self):
            for t in self.liste_entier:
                self.int=self.int+t
     
            print self.int
     
        def waitafter(self):
     
            a=Timer(2,self.afterrdm,[],{})
            a.start()
            print localtime()
     
            quit()
     
        def purge(self):
     
            print self.liste
            for t in self.liste:
                   self.liste_entier.insert(0,round(t))
     
     
            print self.liste_entier
     
    a=Loto(47,[],0,[])
    event=Event()
    q0=Thread(None,a.wait,None,(),None)
    q0.start()
    event.set()
    q0.join(2)
    q3=Thread(None,a.purge,None,(),None)
    q3.start()
    q3.join(2)
    q1=Thread(None,a.waitafter,None,(),None);
     
    q1.start()
    q1.join()
    toute propositiion est la bien venue en attendant un post svp,je vais continuer a chercher de la doc ou des exemple
    merci et bon courage a tous a++

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 93
    Par défaut j ai essayer le mutex
    mais ca ne marche pas mes ressource critique ets toujours instancier comme au debut j ai une question est ce que je peux bloquer un thread qui appelle une methode de classe si j instancie un Lock dans ma classe
    je ne sais pas si j ai etait clair,je reste a votre dispo pour toute precision

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne me suis pas lancé dans l'interprétation de ton code, mais si tu veux que les 3 threads, une fois lancés, interviennent dans un ordre particulier, voilà comment je ferais:

    - créer une variable "statut" (éventuellement globale ou équivalent) consultable et modifiable par tous les threads, et initialisée à 1.

    - créer un verrou vstatut" (Lock) pour l'utilisation de cette variable par les threads

    - chaque thread est codé de la façon suivante:

    1- pour le 1er thread:

    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
     
    # avant le début de l'action:
    while True:
        vstatut.acquire()
        if statut==1:
            vstatut.release()
            break
        vstatut.release()
        # selon l'application, tu peux mettre une tempo ici. Ex: time.sleep(0.1)
     
    # action
    ...
    ...
     
    # et à la fin de l'action:
    vstatut.acquire()
    statut=2
    vstatut.release()
    2- pour le 2ème: idem à part que la valeur cherchée est statut==2 et que celui-ci passe à 3 à la fin

    3- pour le 3ème: idem à part que la valeur cherchée est statut==3 et que celui-ci passe à ??? à la fin selon la suite que tu souhaites donner. Si ça repasse à 1, le cycle recommence si les threads ont été maintenus en vie (dans une sur-boucle while par exemple).

    En faisant comme cela, tu peux lancer les threads dans n'importe quel ordre, il n'agiront que dans l'ordre précisé par les valeurs successives de la variable "statut".

    Tyrtamos

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Bonjour,

    Juste une petite amélioration: on pourrait utiliser une Condition (classe du module threading) au lieux d'un Lock, afin d'éviter une attente active.
    Avertissement: Je n'ai pas testé ce qui suit.
    Si la condition s'appelle cond, le code dans le premier thread ressemblerait à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cond.acquire()
    while statut <> 1:
        cond.wait()        # attend d'être notifié d'un changement de statut
     
    # action thread 1
     
    statut = 2
    cond.notifyAll()       # signale que la valeur de statut a changé
    cond.release()
    Idem dans les 2 autres threads, en changeant la valeur de statut.

    En regardant le code du premier post, je me rends compte qu'il y a d'autres threads que ces trois là, créés par Timer. Il faudrait que la statut et la notification soient effectués après l'expiration de ces timers, mais si tu ne veux pas modifier le code appelé par ces Timers, une solution simple serait de faire un join sur le Timer juste après le start. Mais je ne vois pas trop pourquoi introduire tant de complexité artificiellement...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 93
    Par défaut merci a vous
    j ai effecttivement utiliser un lock mais ca marche aussi bien avec un semaphore ou une condition en fait j ai aussi lever le timer qui faisais suer
    et le lock je l ai actionner juste avant l utilisation du thread et je le relache juste appres et pareil pour les autres thread
    merci a vous deux pour vos lumiere

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

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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