Profil supprimé | 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
Code :
- class Task:
- def __init__(self, func, when, id, args):
- """
- Arguments:
- - func -- la fonction a éxecuter.
- - when -- le nombre de secondes d'attente
- ou l'interval si c' est une tâche
- qui doit se répéter.
- - id -- le nom de la tâche.
- - args -- les arguments à passer à la fonction.
- """
-
- self.func = func
- self.seconds = when
- self.when = time.time() + when
- self.id = id
- self.args = args
-
- def run(self):
- """
- Exucte la fonction.
- """
- try:
- if self.args:
- self.func(*self.args)
- else:
- self.func()
- except:
- log.error('Error in scheduled task: #id %s, (%s)' % \
- (self.id, repr(self.func)))
- class Scheduler:
- def __init__(self):
- """
- Scheduler object.
- Contient deux méthodes principales:
- - addEvent: executes une tâche à un moment précis.
- - addPeriodicEvent: répétes une tâche à intervals réguliers
- toutes les n secondes.
- """
- # contient les instances de Task équivalent
- # aux taches en attente d' execution.
- self.schedule = []
-
- def addEvent(self, id, func, t, args):
- """
- addEvent(id, function, seconds, ('arg1','arg2',))
- """
- task = Task(func, t, id, args)
- when = time.time() + t
- if self.schedule:
- # on trie les tâches en fonction
- # de leurs secondes d'execution.
- if when > self.schedule[-1].when:
- self.schedule.append(task)
- return
- else:
- self.schedule.insert(-2, task)
- return
- log.debug('Add new scheduled Task, #id: %s' % id)
- self.schedule.append(task)
-
-
- def addPeriodicEvent(self, id, func, t, args):
- """
- addPeriodicEvent(id, function, seconds, ('arg1','arg2',))
- """
- def event():
- self.addEvent(id, func, t, args)
- return self.addEvent(id, event, t, ())
- return event()
-
-
- def removeEvent(self, id):
- log.debug('Remove scheduled Task, #id: %s' % id)
- self.schedule = [i for i in self.schedule if i.id != id]
-
-
- def ids(self):
- """
- return les noms (id) de chaque tâches
- contenus dans self.schedule.
- """
- L = []
- for i in self.schedule:
- # on évite de les rajouter en double
- # dans le cas d'un event périodique.
- if not i.id in L:
- L.append(i.id)
- return L
|
Code :
- S = Scheduler()
- while S.schedule and S.schedule[0].when \
- <= time.time():
- S.schedule[0].run()
- S.schedule.pop(0)
- break
|
Message édité par Profil supprimé le 11-08-2004 à 12:54:15
|