Tornado-koroutine
Ich versuche zu lernen tornado Coroutinen, aber ich habe Fehler mit folgenden code.
Traceback (most recent call last):
File "D:\projekty\tornado\env\lib\site-packages\tornado\web.py", line 1334, in _execute
result = yield result
File "D:\projekty\tornado\env\lib\site-packages\tornado\gen.py", line 628, in run
value = future.result()
File "D:\projekty\tornado\env\lib\site-packages\tornado\concurrent.py", line 109, in result
raise_exc_info(self._exc_info)
File "D:\projekty\tornado\env\lib\site-packages\tornado\gen.py", line 631, in run
yielded = self.gen.throw(*sys.exc_info())
File "index.py", line 20, in get
x = yield 'test'
File "D:\projekty\tornado\env\lib\site-packages\tornado\gen.py", line 628, in run
value = future.result()
File "D:\projekty\tornado\env\lib\site-packages\tornado\concurrent.py", line 111, in result
raise self._exception
BadYieldError: yielded unknown object 'test'
Code:
from tornado.ioloop import IOLoop
from tornado.web import RequestHandler, Application, url
from tornado import gen
class HelloHandler(RequestHandler):
@gen.coroutine
def get(self):
x = yield 'test'
self.render('hello.html')
def make_app():
return Application(
[url(r"/", HelloHandler)],
debug = True
)
def main():
app = make_app()
app.listen(8888)
IOLoop.instance().start()
main()
Was versuchen Sie zu tun, um die Linie
das ist nur ein Beispiel, ich habe versucht, Ertrag Ergebnis einer Funktion zu - das Ergebnis ist das gleiche, diese Zeile ist nur zum testen von Coroutinen
x = yield 'test'
?das ist nur ein Beispiel, ich habe versucht, Ertrag Ergebnis einer Funktion zu - das Ergebnis ist das gleiche, diese Zeile ist nur zum testen von Coroutinen
InformationsquelleAutor klis87 | 2014-11-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lutz Horn darauf hingewiesen, daß die
tornado.coroutine
decorator erfordert, dass Sie liefern nurFuture
Objekte oder bestimmte Container mitFuture
Objekte. So versuchen, um die Ausbeute einesstr
wird ein Fehler ausgelöst. Ich denke, das Stück, das Sie noch fehlt, ist, dass jeder Ort innerhalb einer coroutine, wo Sie anrufen möchtenyield something()
,something
muss entweder auch eine koroutine, oder zurückgeben einerFuture
. Zum Beispiel könnten Sie fix Ihr Beispiel so:Oder auch diese (obwohl in der Regel sollten Sie nicht tun es auf diese Weise):
Natürlich, das sind erfundene Beispiele, da wir nicht wirklich etwas zu tun asynchrone
do_test
gibt es keinen Grund, es zu machen einer coroutine. Normalerweise würde man das tun einige Art der asynchronen I/O in es. Zum Beispiel:Mit
yield function()
wird die Ausführung der koroutine warten, bisfunction()
abgeschlossen hat. Jedoch wird es die nicht - block der tornado I/O-Schleife, so dass, wenn andere Anfragen von Kunden kommen, die könnten behandelt werden, in der Zwischenzeit. Sie können jedoch nicht verwendentime.sleep()
um dies zu testen, denn es ist eine blockierende Funktion. Sie brauchen, um eine nicht-blockierende version von Schlaf. Siehe Antwort für ein Beispiel.Danke jetzt habe ich endlich alles verstanden:)
Können Sie sich die
raise Return ...
Beispiele für Python-3.3+ ? Das Handbuch sagt, man kannreturn
in aktuellen Python Versionen: tornadoweb.org/en/stable/guide/... scheinbar macht dieraise something
Art, die Dinge obsolet.Python 2.7 noch verwenden muss
raise Return(...)
, das ist immer noch eine ziemlich beträchtliche Kundenbasis. Ich werde aktualisieren, die Beispiele zu reflektieren beide Möglichkeiten, es zu tun.InformationsquelleAutor dano
Aus der Dokumentation:
Den string
"test"
ist nicht einFuture
. Versuchen Sie, Rendite.InformationsquelleAutor