2017-05-25 1 views
0

macht Ich habe meinen Web-Server mit der folgenden Anweisung gestartetWie API Anrufungen async in Tornado

tornado.ioloop.IOLoop.current().start() 

ich meine Methoden markiert mit @ gen.coroutine und zurück als Ausbeute Um das Verfahren zu prüfen, ob Anrufe sind asynchron, ich fügte hinzu time.sleep (5) aber die Methodenaufrufe sind alle synchron es wartet 5 Sekunden und die führt die nächsten Anweisungen aus, jeder andere Aufruf an den Tornado-Server wartet nur auf den ersten Aufruf zu vervollständigen. Wie mache ich meine APIS async

Ich habe keine IO-Aufrufe in meinen Methoden, aber CPU intensive mathematische Berechnungen.

Antwort

2

Wie bereits erwähnt, können Sie tornado.gen.sleep verwenden, um Ihre Coroutines mit Schlaf zu arbeiten. Aber letztendlich wird dir das nicht weiterhelfen. Asynchrone Programmierung ist für den Fall vorgesehen, dass Sie zusätzliche Verarbeitung durchführen möchten, während IO verarbeitet werden soll. Routinen laufen weiter, während CPU-Arbeit zu erledigen ist. Selbst wenn Sie die richtigen asynchronen Primitive verwenden, werden Sie beim Ausführen Ihrer Berechnungen blockieren.

Im Prinzip funktioniert die Thread-Programmierung in dieser Situation besser, weil jeder Thread gleichzeitig ausgeführt werden kann, um Fortschritte bei der CPU-gebundenen Arbeit zu erzielen. Das wird dir mit Python jedoch nicht viel helfen. Aufgrund der Funktionsweise von Thread-Locking in Python kann im Grunde immer nur ein Python-Thread ausgeführt werden. Sie können sich das Multiprocessing-Modul ansehen, um zu sehen, ob Sie jede Ihrer Berechnungen in einem separaten Prozess ausführen können. Das ist wahrscheinlich der beste Weg, ein Multi-CPU-System für Python effizient zu nutzen.

3

Von Tornado docs:

Der Grund dafür ist, dass time.sleep eine Sperrfunktion ist: es ist nicht die Steuerung an die IOLoop zurückzukehren erlaubt, so dass andere Handler ausgeführt werden können.

Sie können mehr darüber lesen here.

Sie sollten stattdessen time.sleep durch koroutinenfreundliches Äquivalent tornado.gen.sleep ersetzen.

Verwandte Themen