Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2347 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Lancer un thread et passage de paramètre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Lancer un thread et passage de paramètre

n°743833
peon3
Posté le 28-05-2004 à 16:48:06  profilanswer
 


Salut à tous,
 
je suis en train de me lancer dans les thread, et j'ai récupérer plusieurs infos entre la doc et les exemples sur internet.
 
j'en suis arrivé à faire ceci :
 
 

Code :
  1. import threading
  2. import deleteFile
  3. import time
  4. class Task( threading.Thread ):
  5.     def __init__( self, action, loopdelay, initdelay ):
  6.         self._action = action
  7.         self._loopdelay = loopdelay
  8.         self._initdelay = initdelay
  9.         self._running = 1
  10.         threading.Thread.__init__( self )
  11.     def __repr__( self ):
  12.         return '%s %s %s' % (
  13.             self._action, self._loopdelay, self._initdelay )
  14.     def run( self ):
  15.         if self._initdelay:
  16.             time.sleep( self._initdelay )
  17.         self._runtime = time.time()
  18.         while self._running:
  19.             start = time.time()
  20.             self._action()
  21.             self._runtime += self._loopdelay
  22.             time.sleep( self._runtime - start )
  23.     def stop( self ):
  24.         self._running = 0
  25.    
  26. class Scheduler:
  27.     def __init__( self ):
  28.         self._tasks = []
  29.        
  30.     def __repr__( self ):
  31.         rep = ''
  32.         for task in self._tasks:
  33.             rep += '%s\n' % `task`
  34.         return rep
  35.        
  36.     def AddTask( self, action, loopdelay, initdelay = 0 ):
  37.         task = Task( action, loopdelay, initdelay )
  38.         self._tasks.append( task )
  39.    
  40.     def StartAllTasks( self ):
  41.         for task in self._tasks:
  42.             task.start()
  43.    
  44.     def StopAllTasks( self ):
  45.         for task in self._tasks:
  46.             print 'Stopping task', task
  47.             task.stop()
  48.             task.join()
  49.             print 'Stopped'
  50. if __name__ == '__main__':
  51.     def t1() :
  52.         print "t1"
  53.     s = Scheduler()
  54.     s.AddTask(t1, 1, 0)
  55.     s.StartAllTasks()
  56.     raw_input()
  57.     s.StopAllTasks()


 
ce que je n'arrive pas à faire, c'est mettre un paramètre à la fonction t1(arg). Puis de le passer dans s.AddTask(t1(arg), ...) ou s.AddTask(t1,..., arg).
 
 
Si vous avez des idées.
 
 
Merci

mood
Publicité
Posté le 28-05-2004 à 16:48:06  profilanswer
 

n°743846
Taz
bisounours-codeur
Posté le 28-05-2004 à 16:52:34  profilanswer
 

wrap tout dans une autre fonction ou une lamnda
 
s.AddTash(lambda : t1(x), ...)
 
 
pour attêter tes thread utilises des threading.Event et pas des sleep

n°743893
peon3
Posté le 28-05-2004 à 17:14:13  profilanswer
 

Merci beaucoup, ça marche bien, mais j'ai un autre problème.
 
Je veux lancer t1(x) avec des arguments différents, donc je pensait faire :  
 

Code :
  1. x = "toto1"
  2. s.AddTash(lambda : t1(x), ...)
  3. x = "toto2"
  4. s.AddTash(lambda : t1(x), ...)


 
Mais ça me prend en compte toujours "toto2".
pourtant je pensait que chaque thread garderait son paramètre ?

n°743897
Taz
bisounours-codeur
Posté le 28-05-2004 à 17:15:20  profilanswer
 

ben tu leur passe x, donc la référence, si tu modifies x ...

n°743905
peon3
Posté le 28-05-2004 à 17:18:45  profilanswer
 

Oui, justement.
 
en fait je lis un fichier avec des paramètres.
Mais je ne sais pas combien de paramètres je vais avoir donc, je lis une ligne, je met le paramètre dans x et je fais mon AddTask(t1(x), ...).
 
Je vais chercher un peu ...
 
Merci

n°744018
peon3
Posté le 28-05-2004 à 18:37:52  profilanswer
 


Voilà, j'essaie de passer par un dictionnaire.
Donc je crée un dictionnaire : dict = {}
Puis dans une boucle, je lis mon fichier ligne par ligne et j'ajoute les arguments dans mon dictionnaire :  
 

Code :
  1. dict[i] = arg
  2. i = i + 1


 
à la fin de la boucle, quand j'affiche  dict, tout est OK, j'ai bien tous mes arguments.
Ensuite, je fais mes :
 

Code :
  1. AddTask(lambda : a[i], int(arg3), int(arg4))


dans une autre boucle, mais j'ai l'erreur suivante :  
 
AddTask(lambda : a[i], int(arg3), int(arg4))
KeyError: 2
 
 
 
Merci de votre aide.

n°744020
peon3
Posté le 28-05-2004 à 18:38:55  profilanswer
 

oupss :  
 
la dernière ligne est :
 
AddTask(lambda : dict[i], int(arg3), int(arg4))  
KeyError: 2  
 
 
désolé, faute de frappe

n°744026
Taz
bisounours-codeur
Posté le 28-05-2004 à 18:51:29  profilanswer
 

écoute : consolide tes bases (parce que la tu bites rien aux références) et après crée un objet fonction (un objet qui porte ses arguments et qui fournit __call__)

n°747466
peon3
Posté le 01-06-2004 à 15:32:30  profilanswer
 

Salut,
 
en effet, j'ai surement pas toutes les bonnes bases pour me lancer dans les threads, je me suis pour l'instant servi de python uniquement pour des petits scripts d'administration (suppression/copie de fichiers, purges...), je trouve ce language très simple et très pratique pour faire ce genre d'actions.
 
Mais aujourd'hui, j'ai besoin de faire d'autres choses et c'est pourquoi je demande de l'aide.
 
Pour en revenir au problème, j'ai créé un objet avec 4 arguments mais je ne comprends pas ce que tu veux dire par "qui fournit __call__", le peu de chose que j'ai trouvé sur internet là-dessus n'ont pas été très clair.
 
Si tu pouvais détailler ?
 
 
Merci

n°747754
peon3
Posté le 01-06-2004 à 18:01:14  profilanswer
 

J'ai résolu mon problème :
 
J'ai modifier ma classe Task, qui devient ceci :

Code :
  1. class Task( threading.Thread ):
  2.     def __init__( self, action, loopdelay, initdelay, arg ):
  3.         if ( action == 'delete' ) :
  4.             self._action = lambda : self.t1(arg)
  5.         elif ( action == 'erase' ) :
  6.             self._action = lambda : self.t2(arg)
  7.            
  8.         self._loopdelay = loopdelay
  9.         self._initdelay = initdelay
  10.         self._running = 1
  11.         threading.Thread.__init__( self )
  12.     def __repr__( self ):
  13.         return '%s %s %s' % (
  14.             self._action, self._loopdelay, self._initdelay )
  15.     def run( self ):
  16.         if self._initdelay:
  17.             time.sleep( self._initdelay )
  18.         self._runtime = time.time()
  19.         while self._running:
  20.             start = time.time()
  21.             self._action()
  22.             self._runtime += self._loopdelay
  23.             time.sleep( self._runtime - start )
  24.     def t1 ( self, arg ) :
  25.         deleteFile.wichFilesToTreate( arg )
  26.     def t2 ( self, arg ) :
  27.         deleteFile.eraseFile( arg )
  28.     def stop( self ):
  29.         self._running = 0


 
J'y ai rajouté deux fonctions, t1 et t2 qui sont mes 2 tâches (que je veux lancer plusieurs fois avec des arguments différents).
 
Et 1 paramètre qui est l'arguments que je veux passer en paramètre à t1 ou t2 selon l'action que je veux effectuer.
 
Maintenant je peux déclarer autant de AddTask(...) que je veux. C'est toujours t1 ou t2 qui se lancent, mais maintenant les fonctions conservent mes arguments.
 
 
Merci pour votre aide.
 
PS : Si vous avez des suggéstions, je suis toujours preneur ...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Lancer un thread et passage de paramètre

 

Sujets relatifs
!Urgent! Problème ASP lors passage IIS 4.0 --> 5.0[HTML & PHP] Passage variable en adresse
[VB6] passage de variablethread en python
variable passée en paramètre dans urlpb d'utilisation des thread sous linux - Résolu
Lancer une macro excel depuis un batchLancer Macro access depuis excel
[ASP + Access] Lancer un Etat Access à partir d'une page ASPpassage par référence pour objets php [OK]
Plus de sujets relatifs à : Lancer un thread et passage de paramètre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR