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 :

Thread / Passage de parametres


Sujet :

Python

  1. #1
    Membre chevronné

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2010
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2010
    Messages : 178
    Par défaut Thread / Passage de parametres
    Bonjour !

    Je cherche à faire passer un paramètre entre deux threads.

    Pour l'exemple type NON fonctionnel mais qui représente bien ce que je cherche à faire:

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*- 
     
    import threading
    import time
     
    class thread_1(threading.Thread):  
        def __init__(self, nom=''):
            threading.Thread.__init__(self)
            self.nom = nom
            self.Terminated = False       
     
        def run(self):
            param = "HEY"
            while True:
                time.sleep(2)
                print param
     
        def stop(self):
            self.Terminated = True
     
     
    class thread_2(threading.Thread):    
        def __init__(self, nom=''):
            threading.Thread.__init__(self)
            self.nom = nom
            self.Terminated = False
     
        def run(self):
            time.sleep(5)
            param = "changement !"
     
        def stop(self):
            self.Terminated = True
     
     
    print "Lancement des threads...",
    a = thread_1('Threadname_1')
    a.start()
     
    b = thread_2('Threadname_2')
    b.start()
    print "[OK]"
    Vous l'aurez sans doute remarqué, j’essaye de changer le paramètre "param" qui est affiché par le Thread_1 en modifiant sa valeur dans le Thread_2 au bout de 5secondes.

    Après avoir un peu googler , j'ai vu des pistes en utilisant "queue"... Mais j'ai pas vraiment compris.

    Donc si quelqu'un saurait !

    Merci

  2. #2
    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,

    Sans utiliser queue, on peut faire, en plaçant "param" comme variable globale, et en permettant à chacun des threads de modifier sa valeur, mais à condition d'utiliser un verrou, pour empêcher les tentatives d'accès simultannés.

    Voilà un petit exemple sur la base de ton 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
    import threading
    import time
     
    class thread_1(threading.Thread):
        def __init__(self, nom=''):
            threading.Thread.__init__(self)
            self.nom = nom
            self.encore = True
     
        def run(self):
            global verrou
            while self.encore:
                time.sleep(0.5)
     
                verrou.acquire()
                param = self.nom
                print param
                verrou.release()
     
        def stop(self):
            self.encore = False
     
     
    class thread_2(threading.Thread):
     
        def __init__(self, nom=''):
            threading.Thread.__init__(self)
            self.nom = nom
            self.encore = True
     
        def run(self):
            global verrou
            while self.encore:
                time.sleep(0.5)
     
                verrou.acquire()
                param = self.nom
                print param
                verrou.release()
     
        def stop(self):
            self.encore = False
     
    verrou = threading.Lock()
     
    param = None
     
    print "Lancement des threads..."
     
    a = thread_1('Threadname_1')
    a.start()
     
    b = thread_2('Threadname_2')
    b.start()
     
    time.sleep(10)
     
    a.stop()
    b.stop()
    while a.isAlive() or b.isAlive():
        time.sleep(0.1)
     
    print "Fin"
    Comme on peut le voir dans les sorties, il n'est pas garanti que les threads agissent alternativement sur param. Si on le voulait, on pourrait ajouter une variable supplémentaire pour que chaque thread attende que l'autre ait agi pour agir lui-même.

  3. #3
    Membre chevronné

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2010
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2010
    Messages : 178
    Par défaut
    Bon, je n'ai pas encore pigé tous ce que tu as modifié, mais effectivement en définissant la même variable globale dans chaque thread, sa permet de passer des paramètres.

    Merci pour ton aide !

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    522
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 522
    Par défaut
    Salut,

    C'est quand même assez moche d'utiliser des variables globales pour ça.
    Tu peux passer des paramètres à un thread de cette façon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    objThread = threading.Thread(target=ma_fonction, args=[value1,value2])
     
    def ma_fonction(param1, param2):
        pass

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

Discussions similaires

  1. Thread et passage de parametre
    Par olibara dans le forum C#
    Réponses: 12
    Dernier message: 29/11/2011, 13h35
  2. [THREAD][AFX]Passage de parametre
    Par Kin0u dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 09/09/2009, 11h48
  3. Réponses: 4
    Dernier message: 04/09/2007, 13h13
  4. Passage de parametre calculé
    Par soazig dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 06/06/2003, 16h25
  5. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 17h59

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