[PYTHON] Implémentez un thread qui peut être suspendu en exploitant le rendement

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)

Aucune sortie pendant 2 secondes

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

Recommended Posts

Implémentez un thread qui peut être suspendu en exploitant le rendement
[Python] Un programme qui trouve une paire qui peut être divisée par une valeur spécifiée
Comment installer la bibliothèque Python qui peut être utilisée par les sociétés pharmaceutiques
Lister les classes qui peuvent être référencées par ObjCClass
Comment créer une propriété de relations qui peuvent être prefetch_related par des conditions spécifiques
Faisons un diagramme sur lequel on peut cliquer avec IPython
Convertir les données de maillage exportées de SpriteUV2 dans un format pouvant être importé par Spine
[Python] Créez un graphique qui peut être déplacé avec Plotly
Créez une Spinbox qui peut être affichée en binaire avec Tkinter
Un minuteur (ticker) qui peut être utilisé sur le terrain (peut être utilisé n'importe où)
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
Créez une Spinbox pouvant être affichée dans HEX avec Tkinter
Créez un graphique des devises qui peut être déplacé avec Plotly (1)
Puis-je être un data scientist?
"Obake" peut être chanté par "you"
Confirmation que rkhunter peut être installé
J'ai créé un modèle de projet Python générique
Masquer l'avertissement selon lequel zsh peut être utilisé par défaut sur Mac
Comment créer un bot Janken qui peut être facilement déplacé (commentaire)
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal
Une histoire que heroku, qui peut se faire en 5 minutes, a en fait duré 3 jours
Notes pour créer des figures pouvant être publiées dans des revues avec matplotlib
Classe pour PYTHON qui peut être utilisée sans connaître LDAP
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
Notes personnelles des opérations liées aux pandas qui peuvent être utilisées dans la pratique
Formatez les données DataFrame avec Pytorch sous une forme pouvant être entraînée avec NN
Lisez l'image postée par flask afin qu'elle puisse être manipulée par opencv
[Hackason] À propos de la création d'un outil pouvant être imprimé sur Raspberry Pi [Outil pratique]
Module de grattage "Gaspacho" qui peut être utilisé plus facilement que Beautiful Soup