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