Heim >Backend-Entwicklung >Python-Tutorial >Python-Gevent-Implementierungsmechanismus
Das Greenlet, das ich mir zuvor angesehen habe, bietet nur die Grundfunktion von Coroutine und ist die kleinste Ausführungseinheit. Wenn Sie es jedoch verwenden möchten, müssen Sie einen Zeitplaner bereitstellen, um zu planen, welche Greenlets wann ausgeführt werden sollen Schauen Sie sich die Implementierung von gevent an. Die aktuelle stabile Version verwendet eine Alternative zu libev.libev. Sie unterstützt viele Ereignistypen, aber die am häufigsten verwendeten sind io- und Timer-Typen Vom System bereitgestellte Aufrufe. Der Timer-Typ wird durch die Aufrechterhaltung eines minimalen Heaps implementiert.
import gevent from gevent import monkey monkey.patch_all() def download(): import urllib2 urllib2.urlopen('http://www.google.com/').read() c = gevent.spawn(download) gevent.joinall([c])gevent durch spawn Erstellen und starten Sie ein Greenlet. Um dieses Greenlet zu starten, fügen Sie dieses Greenlet zum Vorbereitungsrückruf von libev hinzu Nach der Ausführung wird die Funktion im Prepare-Callback aufgerufen. Dadurch wird sichergestellt, dass jedes erzeugte Greenlet nur einmal ausgeführt wird und lesen, da es sich um io-Operationen (socket.[send|recv]) handelt, kapselt gevent diese Funktionen durch Monkey Patch. Wenn die entsprechende Operation aufgerufen wird, wird ein Watcher erstellt, der fd entspricht, und zur Ereignisliste von libev hinzugefügt.
Wenn verwandte Lese- und Schreibereignisse auftreten, wird der entsprechende Rückruf den Schalter des Greenlets aufrufen, um die Coroutine zu wechseln.