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] Nom du thread


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut [Thread] Nom du thread
    Bonjour,
    le nom du topic n'est pas idéal mais je n'en trouvais pas de plus appropriés.

    Pour améliorer la vitesse de traitement de mon programme (un programme qui analyse un ou plusieurs logs) j'ai décidé d'utiliser les threads

    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
     
    def main():
    	listeDesFichiersAtraiter=[]
    	cont=[]
    	b=''
    	while True:
    		FichierAtraiter = raw_input('chemin du fichier : ')
    		listeDesFichiersAtraiter.append(FichierAtraiter)
    		yes = raw_input('Voulez-vous en traiter un autre : ')
    		if yes !='O':
    			break
     
    	resultat=[]
    	while b=='':
    		b = raw_input('taille minimum : ')
     
    	for i in listeDesFichiersAtraiter:
    		t = Thread(target=logbysize1, args=(i,b,))
    		t.start()
    	while len(threading.enumerate())!=1 and type(threading.enumerate()[0])!="<class 'threading._MainThread'>":
    		pass
    j'ai donc une fonction logbysize1 qui récupère le chemin du log et la temps minimum de la durée de l'instruction mais je voudrais aussi envoyer le nom du thread en paramètre

    t.getName me donne le nom du thread mais je ne peux pas le mettre dans les args car t n'est pas encore créé. Au début je voulais le récupérer directement dans ma fonction logbysize1 mais je n'ai pas trouvé non plus.

    Si vous avez besoins d'autres informations ou d'explications plus précises n'hésitez pas.

    Merci d'avance
    M.L.G.

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Par défaut
    Une solution: au lieu d'utiliser Thread directement, tu peux dériver la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class MyThread(Thread):
        def run(self):
            logbysize1(self.getName())
    en utilisant MyThread au lieu de Thread dans ton appli, ca devrait marcher.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut
    Merci pour cette réponse rapide,
    il y a un truc que je ne comprend pas très bien dans ta réponse : en effet surcharger la méthode run() est une possibilité mais je n'arrive pas à comprendre comment je l'appel (bon run() est appelé par bootstrap() qui lui même est appelé par start() on est d'accord la dessus)

    en effet comment est ce qu'avec cette surcharge j'appelle ma fonction?
    comme ceci? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	for i in listeDesFichiersAtraiter:
    		t = Thread(target=logbysize1, args=(i,b,))
    		t.myThread.run()
    en faite je ne comprend pas très bien s'il faut remettre la target vu qu'elle est indiquée dans le run() ?

    Merci d'avance
    M.L.G.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Par défaut
    Non, il faut toujours appeler start(), et il ne faut pas mettre la target, qui lui va appeler le run de la classe dérivee:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i in listeDesFichiersAtraiter:
    		t = MyThread(i,b)
    		t.start()
    A cause des arguments, il faut modifier MyThread un peu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class MyThread(Thread):
        def __init__(self,i,b):
            Thread.__init__(self)
            self.i=i
            self.b=b
     
        def run(self):
            logbysize1(self.getName(),self.i,self.b)
    En fait, le principe de thread est le suivant: on appelle la méthode start, qui provoque la création d'une thread system avec comme point d'entrée la méthode run de la classe.
    Le run par défaut de Thread appelle la target avec les arguments passés en init. Comme tu surcharge run, il va ignorer la target et executer run.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut
    merci bien j'y vois plus clair, maintenant le problème vu que j'y vois plus clair c'est que je vais avoir du mal à utiliser cela vu que j'utilise les threads pour lancer plusieurs méthodes différentes (logbysize1, logbykey1, traitement_excel, et d'autres ...)

    Est ce que ta méthode est utilisable malgré le faite que j'ai plusieurs méthodes? (j'en doute puisque la fonction utilisée dans run() est en dure à moins peut être de faire des "if elif elif else" sur une variable définie en globale (car si on veut la mettre en argument va falloir réécrire la classe Thread non?)

    Je ne sais pas si je suis très claire, je n'avais mis qu'une fonction pour la lisibilité de l'exemple mais cela à créé plus de problème qu'autre chose.

    (si besoin je peux poster tout le code mais c'est tellement long et mal codé que .... j'aurais un peut honte)

    Merci de ton aide

    M.L.G.

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Par défaut
    Eh bien, dans l'init tu passes en plus le nom de la méthode a appeler...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class MyThread(Thread):
        def __init__(self,method,i,b):
            Thread.__init__(self)
            self.method=method
            self.i=i
            self.b=b
     
        def run(self):
            self.method(self.getName(),self.i,self.b)
    et tu appelles MyThread(logbysize1,i,b)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut
    merci bien c'est ce que je voulais (à force de travailler sur le même programme je ne vois plus le problème dans son ensemble ça m'énerve ...)

    encore merci

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

Discussions similaires

  1. [Debug]Donner des noms aux thread lors du débugage
    Par jeje99 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 21/12/2005, 16h49
  2. Réponses: 4
    Dernier message: 12/11/2005, 14h02
  3. [Thread]Relancer un thread
    Par Pill_S dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 28/04/2005, 20h41
  4. Réponses: 3
    Dernier message: 11/02/2004, 12h50

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