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!
# Mieux?
Posté par niol (site web personnel) . En réponse au message Threads : Help !. Évalué à 3.
#!/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!