Lancer un thread et passage de paramètre

Lancer un thread et passage de paramètre - Python - Programmation

Marsh Posté le 28-05-2004 à 16:48:06    


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

Reply

Marsh Posté le 28-05-2004 à 16:48:06   

Reply

Marsh Posté le 28-05-2004 à 16:52:34    

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

Reply

Marsh Posté le 28-05-2004 à 17:14:13    

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 ?

Reply

Marsh Posté le 28-05-2004 à 17:15:20    

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

Reply

Marsh Posté le 28-05-2004 à 17:18:45    

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

Reply

Marsh Posté le 28-05-2004 à 18:37:52    


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.

Reply

Marsh Posté le 28-05-2004 à 18:38:55    

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

Reply

Marsh Posté le 28-05-2004 à 18:51:29    

é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__)

Reply

Marsh Posté le 01-06-2004 à 15:32:30    

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

Reply

Marsh Posté le 01-06-2004 à 18:01:14    

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 ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed