Einfache asynchrone Beispiel mit tornado-python
Möchte ich finden einfache asynchrone server-Beispiel.
Ich habe eine Funktion mit viel warten, Datenbank-Transaktionen, ... etc:
def blocking_task(n):
for i in xrange(n):
print i
sleep(1)
return i
Ich muss es ausführen, Funktion im Prozess getrennt, ohne zu blockieren. Ist es möglich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tornado ist konzipiert, um alle Ihre Operationen in einem einzigen thread, sondern nutzen den asynchronen I/O zu vermeiden, blockieren Sie so viel wie möglich. Wenn die DB Sie verwenden, über asychrone Python-Bindungen (im Idealfall ausgerichtet für Tornado speziell, wie Motor für MongoDB oder momoko für Postgres), dann werden Sie in der Lage zur Ausführung Ihrer DB-Abfragen, ohne zu blockieren den server; keine separate Prozesse oder threads gebraucht werden.
Zur Adresse, den genauen Beispiel, das Sie Gaben, wo
time.sleep(1)
aufgerufen wird, könnten Sie diesen Ansatz verwenden, um es zu tun asynchron via tornado Coroutinen:Der interessante Teil ist
async_sleep
. Diese Methode ist die Schaffung eine asynchrone Task, die den Aufruf derioloop.add_timeout
Methode.add_timeout
eine angegebene callback-nach einer bestimmten Anzahl von Sekunden, ohne die Blockierung der ioloop während der Wartezeit für den timeout abläuft. Es erwartet zwei Argumente:Wie Sie sehen können in dem obigen Beispiel haben wir uns nur für die Bereitstellung von einem parameter zum
add_timeout
explizit im code, was bedeutet, dass wir am Ende dieses:Wir sind nicht die Bereitstellung der erwarteten parameter callback. In der Tat, wenn
gen.Task
führtadd_timeout
es hängt eincallback
keyword argument an das Ende der explizit mit Parametern versorgt. Also diese:Ergebnisse in dieser wird ausgeführt, innerhalb gen.Aufgabe():
Wenn
gen.Callback
ausgeführt wird, nachdem der timeout, es signalisiert, dass diegen.Task
abgeschlossen ist, und die Programmausführung wird fortgesetzt auf der nächsten Zeile. Dieser Fluss ist schwierig zu verstehen, zumindest auf den ersten (es war sicherlich für mich, wenn ich zuerst Lesen es). Es wäre wohl hilfreich zu Lesen, über die Tornado-gen Modul-Dokumentation ein paar mal.Wenn Sie über code können Sie eine rechenintensive operation an http://127.0.0.1:5000/A , die nicht blockiert die Ausführung, sehen Sie durch den Besuch http://127.0.0.1:5000/B sofort, nachdem Sie Besuch http://127.0.0.1:5000/A.
Hier aktualisiere ich die Informationen über Tornado 5.0. Tornado 5.0 eine neue Methode hinzufügen
IOLoop.run_in_executor
. In der "Aufrufen-blocking-Funktion" von Coroutine Muster Kapitel:Auch in der documeng von
run_on_executor
, sagt:In der 5.0-version, IOLoop.run_in_executor wird empfohlen, im use-case-blockierende Funktionen aufzurufen.