• # Mieux?

    Posté par (site web personnel) . En réponse au message Threads : Help !. Évalué à 3.

    La méthode que j'utilise, pour éviter l'attente active comme tu le fais (le while 1 en boucle), est la suivante, qui a l'avantage d'être bloquante (l'OS sait que le processus n'a rien à faire donc utilise le CPU pour autre chose).
    #!/usr/bin/python
    # -*- coding: ISO-8859-15 -*-
    from threading import Thread
    from Queue import Queue
    from time import sleep
    class StopException: pass
    def thread_action(f):
     def newf(self):
     self.working = True
     f(self)
     self.working = False
     return newf
    class ComplexThread(Thread):
     def __init__(self):
     Thread.__init__(self)
     self.__queue = Queue()
     def stop(self):
     raise StopException
     def run(self):
     try:
     self.working = False
     while True:
     # La clé se situe dans le fait que ce queue.get() est bloquant
     self.__queue.get()()
     except StopException:
     # Stoping thread
     pass
     def set_target(self, target):
     self.__queue.put(target)
     @thread_action
     def funct_1(self):
     print('In function 1')
     sleep(2)
     print('finished funct_1')
     @thread_action
     def funct_2(self):
     print('In function 2')
     sleep(2)
     print('finished funct_2')
    if __name__=='__main__':
     test = ComplexThread()
     test.start()
     test.set_target(test.funct_1)
     sleep(0.1)
     while test.working:
     print('.')
     sleep(0.1)
     test.set_target(test.funct_2)
     sleep(0.1)
     while test.working:
     print('o')
     sleep(0.1)
     test.set_target(test.stop)
    
    Bref je te conseille de jeter un oeil à Threading.Lock(), threading.Event(), Queue.Queue(), c'est bon de savoir que ça existe. Aussi, pour commenter un peu ce que j'ai écrit, j'utilise les décorateurs (modifier plusieurs fonctions de la même manière pour changer l'attribut working), et le fait qu'en python, une fonction est un objet que l'on peut passer en paramètre. Bon courage pour la doc!