Heim >Backend-Entwicklung >Python-Tutorial >Python-Gevent-Implementierungsmechanismus

Python-Gevent-Implementierungsmechanismus

巴扎黑
巴扎黑Original
2016-12-09 14:38:401326Durchsuche

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.

Python-Code

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.



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn