J'ai essayé le comportement d'E / S Eventlet non bloquant en Python

J'ai essayé l'opération Eventlet en tant que programmation d'E / S non bloquante en Python. Cependant, il est difficile d'écrire à partir de zéro tout en comprenant le comportement d'Eventlet, j'ai donc fait référence au code d'implémentation du côté d'OpenStack Nove_compute. Live_migration côté Nove_compute

(1) Exemple de code Eventlet

Tout d'abord, un exemple de programme qui exploite uniquement le thread côté utilisateur (thread vert) par lui-même. .. ..

sample1.py


import eventlet
import time
eventlet.monkey_patch()

def _sample_processing():
    print("### Sample processing thread has started")
    for count in range(5):
        print("." *count)
        time.sleep(0.5)
    print("### Sample processing thread has finished")


def start_sample():
    opthread = eventlet.spawn(_sample_processing)
    opthread.wait()


if __name__ == '__main__':
    start_sample()

Essayez de bouger

$ python sample1.py 
### Sample processing thread has started

.
..
...
....
### Sample processing thread has finished

Ensuite, supposons que vous souhaitiez exploiter plusieurs threads verts et lier les opérations, puis développer un peu. .. ..

sample2.py


import eventlet
import time
eventlet.monkey_patch()

def _sample_processing():
    print("### Sample processing thread has started")
    for count in range(5):
        print("." *count)
        time.sleep(0.5)
    print("### Sample processing thread has finished")


def start_sample():
    opthread = eventlet.spawn(_sample_processing)
    finish_event = eventlet.event.Event()

    def thread_finished(thread, event):
        print("### Sample processing thread notification")
        event.send()
    opthread.link(thread_finished, finish_event)

    time.sleep(0)
    _sample_processing_monitor(finish_event)


def _sample_processing_monitor(finish_event):
    while True:
        if not finish_event.ready():
            print("+++ thread is still running!![{}]".format(finish_event._result))
        else:
            print("+++ thread is done!![{}]".format(finish_event._result))
            break
        time.sleep(1)


if __name__ == '__main__':
    start_sample()

J'ai essayé de bouger

$ python sample2.py 
### Sample processing thread has started

+++ thread is still running!![NOT_USED]
.
+++ thread is still running!![NOT_USED]
..
...
+++ thread is still running!![NOT_USED]
....
### Sample processing thread has finished
### Sample processing thread notification
+++ thread is done!![None]

Avec une belle impression, je peux maintenant observer l'achèvement de l'opération du thread vert du côté _sample_processing.

(2) Structure interne de la classe DeepDive of Event

Si vous vérifiez le mécanisme interne de Eventlet's Event class,

class Event(object):
    ...

    _result = None
    _exc = None

    def __init__(self):
        self._waiters = set()
        self.reset()

    def __str__(self):
        params = (self.__class__.__name__, hex(id(self)),
                  self._result, self._exc, len(self._waiters))
        return '<%s at %s result=%r _exc=%r _waiters[%d]>' % params

    def reset(self):
        assert self._result is not NOT_USED, 'Trying to re-reset() a fresh event.'
        self._result = NOT_USED
        self._exc = None

    def ready(self):
        return self._result is not NOT_USED

    ...

    def send(self, result=None, exc=None):
        assert self._result is NOT_USED, 'Trying to re-send() an already-triggered event.'
        self._result = result
        if exc is not None and not isinstance(exc, tuple):
            exc = (exc, )
        self._exc = exc
        hub = hubs.get_hub()
        for waiter in self._waiters:
            hub.schedule_call_global(
                0, self._do_send, self._result, self._exc, waiter)

Il est devenu.

Au début, dans sample2.py, si vous venez d'instancier la classe Event, self._result = NOT_USED La variable d'instance est conservée en tant que, mais lorsque event.send () est invoqué, self._result = None Modifications de.

Enfin, il semble que le côté surveillance (_sample_processing_monitor) puisse juger de l'achèvement de l'opération du thread vert du côté _sample_processing en recherchant le contenu de self._result.

Recommended Posts

J'ai essayé le comportement d'E / S Eventlet non bloquant en Python
J'ai essayé la notification de ligne en Python
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'implémenter la permutation en Python
J'ai essayé d'implémenter PLSA dans Python 2
J'ai essayé d'utiliser l'optimisation bayésienne de Python
J'ai essayé d'implémenter ADALINE en Python
J'ai essayé d'implémenter PPO en Python
J'ai essayé de jouer à un jeu de frappe avec Python
J'ai essayé Python> autopep8
J'ai essayé de simuler "Birthday Paradox" avec Python
J'ai essayé la méthode des moindres carrés en Python
J'ai essayé d'implémenter TOPIC MODEL en Python
J'ai essayé d'ajouter un module Python 3 en C
J'ai essayé d'implémenter le tri sélectif en python
J'ai essayé Python> décorateur
J'ai essayé de représenter graphiquement les packages installés en Python
Bases de l'écran d'entrée / sortie en utilisant tkinter en python3
J'ai essayé d'utiliser TradeWave (commerce du système BitCoin en Python)
J'ai essayé d'implémenter un pseudo pachislot en Python
J'ai essayé d'implémenter le poker de Drakue en Python
J'ai essayé d'implémenter GA (algorithme génétique) en Python
J'ai essayé de résumer comment utiliser les pandas de python
Mémo d'entrée / sortie de stockage par Python dans Azure Functions
J'ai essayé fp-growth avec python
J'ai écrit python en japonais
E / S asynchrones et E / S non bloquantes
J'ai essayé l'extension C de Python
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
Je comprends Python en japonais!
Ce que j'ai appris en Python
J'ai essayé de [gratter] des images de mode et des phrases de texte avec Python.
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
J'ai essayé d'implémenter un automate cellulaire unidimensionnel en Python
J'ai essayé "un programme qui supprime les déclarations en double en Python"
J'ai essayé "Comment obtenir une méthode décorée en Python"
J'ai essayé de programmer le test du chi carré en Python et Java.
J'ai créé une classe en Python et essayé de taper du canard
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé d'implémenter le blackjack du jeu Trump en Python
Comportement lors de la liste dans Python heapq
J'ai essayé webScraping avec python.
Rendre la sortie standard non bloquante en Python
J'ai écrit Fizz Buzz en Python
J'ai essayé d'exécuter GAN dans Colaboratory
J'ai essayé d'utiliser Thonny (Python / IDE)
J'ai essayé Grumpy (allez exécuter Python).
J'ai essayé d'étudier le processus avec Python
Scikit-learn ne peut pas être installé en Python
J'ai écrit la file d'attente en Python
le codeur Web a essayé d'exceller en Python
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
J'ai écrit la pile en Python
J'ai essayé le mouvement Python3 qui change la direction dans le système de coordonnées