banniere.png

Exercice 08 - le design pattern producteur-consommateur

#!/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()

Tarek Ziadé. Copyright 2006. Tous droits réservés. Licence contenu site