Supposons que vous ayez un sous-programme ordinaire
def foo():
print("foo")
print("bar")
foo () # Sortie "foo" et "bar"
Divisez en insérant yield
dans ce
def foo():
print("foo")
yield 0
print("bar")
yield 0
f = foo()
f .__ next__ () # Sortie "foo" f .__ next__ () # Sortie "bar"
En d'autres termes, faites d'un processus un itérateur avec yield
Si vous appliquez ceci à Thread
, vous pouvez implémenter pause / reprendre / suspendre (méthode pause / resume / halt
).
class Shred(Thread):
def __init__(actions):
Thread.__init__()
self._actions = actions
self.is_halted = False
self.is_paused = False
def run():
while True:
if self.is_paused:
continue
if self.is_halted:
return
try:
self._actions.__next__()
except StopIteration:
self.is_halted = True
return
def pause():
self.is_paused = True
def resume():
self.is_paused = False
def halt():
self.is_halted = True
(En fait, il est préférable d'utiliser ʻEvent` pour le drapeau) Cela permet aux points d'étranglement de pause / reprise / suspension d'être représentés uniquement par «yield». En plus d'améliorer la lisibilité, vous pourrez vous concentrer sur l'écriture d'autres logiques.
def baz():
for n in range(10):
print(n)
time.sleep(1)
yield 0
s = Shred(baz())
s.start()
time.sleep(2)
# 0
# 1
# 2
s.pause()
time.sleep(2)
s.resume()
time.sleep(2)
# 3
# 4
# 5
s.halt()
#Fin de sortie
À propos, cet itérateur retournera au sous-programme d'origine si tout le contenu est exécuté.
list(baz())
# 0
# 1
# 2
# ...
# 9
J'ai eu l'idée, mais je ne l'ai pas vraiment utilisée pour les raisons suivantes.
Donc je ne sais pas à quel point c'est utile, mais c'est tout