Angenommen, Sie haben eine gewöhnliche Unterroutine
def foo():
print("foo")
print("bar")
foo () # Ausgabe "foo" und "bar"
Teilen Sie durch Einfügen von "Ausbeute"
def foo():
print("foo")
yield 0
print("bar")
yield 0
f = foo()
f .__ next__ () # Ausgabe "foo" f .__ next__ () # Ausgabe "bar"
Mit anderen Worten, machen Sie einen Prozess zu einem Iterator mit "Yield" Wenn Sie dies auf "Thread" anwenden, können Sie pause / resume / suspend (Methode "pause / resume / halt") implementieren.
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
(Eigentlich ist es besser, "Event" für die Flagge zu verwenden) Dadurch können die Choke-Punkte Pause / Wiederaufnahme / Suspend nur durch "Ausbeute" dargestellt werden. Neben der Verbesserung der Lesbarkeit können Sie sich auf das Schreiben anderer Logik konzentrieren.
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()
#Ende der Ausgabe
Übrigens kehrt dieser Iterator zur ursprünglichen Unterroutine zurück, wenn der gesamte Inhalt ausgeführt wird.
list(baz())
# 0
# 1
# 2
# ...
# 9
Ich bin auf die Idee gekommen, habe sie aber aus folgenden Gründen nicht verwendet.
Ich weiß also nicht, wie hilfreich es ist, aber das war's
Recommended Posts