#!/usr/bin/python
# -*- coding: ISO-8859-15 -*-
from threading import Thread, Event
from Queue import Queue, Empty
from time import sleep
file = Queue()
file.max_size = 10
# voir pour sortir que lorsque la file est vide
class Travailleur(Thread):
def __init__(self):
self._fin = Event()
Thread.__init__(self)
def _log(self, msg):
print msg
def run(self):
while not self._fin.isSet() and file.not_empty:
try:
fonction, args, kw = file.get_nowait()
try:
fonction(*args, **kw)
except:
self._log('erreur au moment de l\'exécution')
except Empty:
pass
self._fin.wait(0.4)
def join(self):
self._fin.set()
Thread.join(self, None)
def ajoute_traitement(traitement, *args, **kw):
""" ajoute le traitement à la file """
assert callable(traitement)
file.put_nowait((traitement, args, kw))
def fonction(nom, duree):
sleep(duree)
print '%s terminé' % nom
if __name__ == '__main__':
# exemple d'utilisation
# création et lancement d'un travailleur
John = Travailleur()
John.start()
try:
# ajout de fonctions à exécuter
for i in range(10):
ajoute_traitement(fonction, 'processus_%d' % i, 0.3)
sleep(6)
finally:
# arrêt du travailleur
John.join()