que pensez vous de ce code ?

que pensez vous de ce code ? - Python - Programmation

Marsh Posté le 11-08-2004 à 12:51:17    

le but c'est de gerer un systeme d' execution de tâches toutes
les n secondes où à un moment précis.
ca à l'air de fonctionner mais j'aimerais bien avoir votre avis
pour peut etre l'améliorer  :jap:  
 

Code :
  1. class Task:
  2.     def __init__(self, func, when, id, args):
  3.         """
  4.         Arguments:
  5.         - func -- la fonction a éxecuter.
  6.         - when -- le nombre de secondes d'attente
  7.                    ou l'interval si c' est une tâche
  8.                    qui doit se répéter.
  9.         - id   -- le nom de la tâche.
  10.         - args -- les arguments à passer à la fonction.
  11.         """
  12.        
  13.         self.func = func
  14.         self.seconds = when
  15.         self.when = time.time() + when
  16.         self.id = id
  17.         self.args = args
  18.        
  19.     def run(self):
  20.         """
  21.         Exucte la fonction.
  22.         """
  23.         try:
  24.             if self.args: 
  25.                 self.func(*self.args)
  26.             else:
  27.                 self.func()
  28.         except:
  29.             log.error('Error in scheduled task: #id %s, (%s)' % \
  30.             (self.id, repr(self.func)))
  31. class Scheduler:
  32.     def __init__(self):
  33.         """
  34.         Scheduler object.
  35.         Contient deux méthodes principales:
  36.          - addEvent: executes une tâche à un moment précis.
  37.          - addPeriodicEvent: répétes une tâche à intervals réguliers
  38.                              toutes les n secondes.
  39.         """
  40.         # contient les instances de Task équivalent
  41.         # aux taches en attente d' execution.
  42.         self.schedule = []
  43.        
  44.     def addEvent(self, id, func, t, args):
  45.         """
  46.         addEvent(id, function, seconds, ('arg1','arg2',))
  47.         """
  48.         task = Task(func, t, id, args)
  49.         when = time.time() + t
  50.         if self.schedule:
  51.             # on trie les tâches en fonction
  52.             # de leurs secondes d'execution.
  53.             if when > self.schedule[-1].when:
  54.                 self.schedule.append(task)
  55.                 return
  56.             else:
  57.                 self.schedule.insert(-2, task)
  58.                 return
  59.         log.debug('Add new scheduled Task, #id: %s' % id)
  60.         self.schedule.append(task)
  61.        
  62.    
  63.     def addPeriodicEvent(self, id, func, t, args):
  64.         """
  65.         addPeriodicEvent(id, function, seconds, ('arg1','arg2',))
  66.         """
  67.         def event():
  68.             self.addEvent(id, func, t, args)
  69.             return self.addEvent(id, event, t, ())
  70.         return event()           
  71.    
  72.    
  73.     def removeEvent(self, id):
  74.         log.debug('Remove scheduled Task, #id: %s' % id)
  75.         self.schedule = [i for i in self.schedule if i.id != id]
  76.        
  77.    
  78.     def ids(self):
  79.         """
  80.         return les noms (id) de chaque tâches
  81.         contenus dans self.schedule.
  82.         """
  83.         L = []
  84.         for i in self.schedule:
  85.             # on évite de les rajouter en double
  86.             # dans le cas d'un event périodique.
  87.             if not i.id in L:
  88.                 L.append(i.id)
  89.         return L


 
 

Code :
  1. S = Scheduler()
  2. while S.schedule and S.schedule[0].when \
  3.                                               <= time.time(): 
  4.                 S.schedule[0].run()
  5.                 S.schedule.pop(0)
  6.                 break


Message édité par Profil supprimé le 11-08-2004 à 12:54:15
Reply

Marsh Posté le 11-08-2004 à 12:51:17   

Reply

Marsh Posté le 11-08-2004 à 13:07:48    

:heink:  
c'est quoi cette boucle imonde qui bloque tout? je dirais d'utiliser des threads+timers ca marche très bien, ou des fonctions de déclenchement de tasks intégrées à l'OS (type cron) c'est fait pour ca.
 
Ensuite pour le code, à première vu en tant que programmeur (très) moyen (si Taz vient il saura surement plus t'en dire que moi... si il a le courage de le faire)
 
-> les arguments par défaut, def addEvent(self, id, func, t, args=()) ca évite self.addEvent(id, event, t, ()) qui est crade et ne veut pas dire grand chose
-> pourquoi devoir saisir l'ID des tâches? celui ci devrait être généré dynamiquement
-> les lists disposent d'une fonction sort() si tu veux les trier
-> j'arrive pas trop a comprendre comment fonctionne/a quoi sert addPeriodicEvent
-> dans les listes, il y a pop() et remove() si tu veux retirer des éléments, reconstruire toute la liste sans remettre l'élément à enlever c'est débile


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 11-08-2004 à 13:55:25    

Masklinn a écrit :

:heink:  
c'est quoi cette boucle imonde qui bloque tout? je dirais d'utiliser des threads+timers ca marche très bien, ou des fonctions de déclenchement de tasks intégrées à l'OS (type cron) c'est fait pour ca.
 
elle bloque rien du tout ma boucle  :heink: si il y a aucune taches
la boucle est ignorée et on passe à la suite, si il y a des tâches seulement la première est executée et break est appelé.

 
Sinon pour les threads, pour l'instant je continues comme ca, si je vois que ca fonctionne pas comme je veux je regarderais de plus près Timer
 
Ensuite pour le code, à première vu en tant que programmeur (très) moyen (si Taz vient il saura surement plus t'en dire que moi... si il a le courage de le faire)
 
 :jap:  
 
-> les arguments par défaut, def addEvent(self, id, func, t, args=()) ca évite self.addEvent(id, event, t, ()) qui est crade et ne veut pas dire grand chose
corrigé  :jap:  
 
-> pourquoi devoir saisir l'ID des tâches? celui ci devrait être généré dynamiquement
 
le problème c est si je veux les supprimer, je suis pas censé savoir quelle nom à telle tàche, bien que ce serait mieux, c'est sur.
 
-> les lists disposent d'une fonction sort() si tu veux les trier
euh oué  :whistle:  
-> j'arrive pas trop a comprendre comment fonctionne/a quoi sert addPeriodicEvent
en fait je rajoutes un event simple qui a comme fonction la sous fonction event() de addPeriodicEvent, donc à chaque fois que l'event est executé un nouvel event est crée. mais là faut tester pour comprendre, je dois surement pas étre tres clair.  :D
 
-> dans les listes, il y a pop() et remove() si tu veux retirer des éléments, reconstruire toute la liste sans remettre l'élément à enlever c'est débile
oué a voir mais je crois que ca me posait problème dans le cas des events ajoutés avec addPeriodicEvent().


 
en tous les cas merci pour tes remarques je vais essailer d'améliorer tout ca  :jap:

Reply

Marsh Posté le 11-08-2004 à 14:09:17    

Citation :

elle bloque rien du tout ma boucle  :heink: si il y a aucune taches
la boucle est ignorée et on passe à la suite, si il y a des tâches seulement la première est executée et break est appelé.


Si il y a une tâche, tu ne peux rien faire pendant qu'elle s'exécute
Si tu lances plusieurs tâches en simultanné elles s'exécutent l'une après l'autre
D'ailleurs t'es obligé de remplir ta liste de tâches avant de lancer l'exécution globale, tu peux pas ajouter de tâche quand le truc se déroule  [:aloy]  

Citation :

le problème c est si je veux les supprimer, je suis pas censé savoir quelle nom à telle tàche, bien que ce serait mieux, c'est sur.


Dans Tasks tu crée un accesseur GetId() et dans Scheduler un GetIdList(), GetId renvoie l'id de la tâche en cours et GetIdList renvoie les Ids de toutes les tâches enregistrées

Citation :

en fait je rajoutes un event simple qui a comme fonction la sous fonction event() de addPeriodicEvent, donc à chaque fois que l'event est executé un nouvel event est crée. mais là faut tester pour comprendre, je dois surement pas étre tres clair.  :D


Ah oui, c'est bien se faire chier pour rien quand tu sais que les timers font ce genre de trucs pour toi [:itm]  

Citation :

oué a voir mais je crois que ca me posait problème dans le cas des events ajoutés avec addPeriodicEvent().


Ca n'enlève qu'un élément à la fois, donc il faut boucler jusqu'a ce que tous les éléments à détruire soient partis si il y en a plusieurs


Message édité par masklinn le 11-08-2004 à 14:10:14

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

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