[PYTHON] Implementieren Sie einen Thread, der durch Ausnutzen von Yield angehalten werden kann

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)

2 Sekunden lang keine Ausgabe

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

Implementieren Sie einen Thread, der durch Ausnutzen von Yield angehalten werden kann
[Python] Ein Programm, das ein Paar findet, das durch einen bestimmten Wert geteilt werden kann
So installieren Sie die Python-Bibliothek, die von Pharmaunternehmen verwendet werden kann
Listen Sie die Klassen auf, auf die ObjCClass verweisen kann
So erstellen Sie eine Eigenschaft von Beziehungen, die durch bestimmte Bedingungen vorab abgerufen werden kann
Lassen Sie uns ein Diagramm erstellen, auf das mit IPython geklickt werden kann
Konvertieren Sie aus SpriteUV2 exportierte Netzdaten in ein Format, das von Spine importiert werden kann
[Python] Erstellen Sie ein Diagramm, das mit Plotly verschoben werden kann
Erstellen Sie eine Spinbox, die mit Tkinter in Binär angezeigt werden kann
Ein Timer (Ticker), der im Feld verwendet werden kann (kann überall verwendet werden)
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
Erstellen Sie eine Spinbox, die mit Tkinter in HEX angezeigt werden kann
Erstellen Sie ein Währungsdiagramm, das mit Plotly (1) verschoben werden kann.
Kann ich Datenwissenschaftler werden?
"Obake" kann von "dir" gesungen werden
Bestätigung, dass rkhunter installiert werden kann
Ich habe eine generische Python-Projektvorlage erstellt
Blenden Sie die Warnung aus, dass zsh auf dem Mac standardmäßig verwendet werden kann
Wie man einen Janken-Bot macht, der leicht bewegt werden kann (Kommentar)
Ich habe einen einfachen Timer erstellt, der vom Terminal aus gestartet werden kann
Eine Geschichte, die Heroku, die in 5 Minuten gemacht werden kann, tatsächlich 3 Tage dauerte
Hinweise zum Erstellen von Zahlen, die mit matplotlib in Zeitschriften veröffentlicht werden können
Klasse für PYTHON, die ohne Kenntnis von LDAP betrieben werden kann
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.
Persönliche Notizen zu Pandas-bezogenen Vorgängen, die in der Praxis verwendet werden können
Formatieren Sie DataFrame-Daten mit Pytorch in ein Formular, das mit NN trainiert werden kann
Lesen Sie das von flask gepostete Bild, damit es von opencv verarbeitet werden kann
[Hackason] Über das Erstellen eines Werkzeugs, das auf Raspberry Pi gedruckt werden kann [Praktisches Werkzeug]
Kratzmodul "Gaspacho", das einfacher zu verwenden ist als Beautiful Soup