Ich habe einige asynchrone Funktionen mit tornado gen.coroutine
, die ich normalerweise als Teil einer Tornado-basierten Webanwendung verwenden. Allerdings möchte ich einige von ihnen aus einem einfachen alten Python-Skript aufrufen, um einige Administrationsaufgaben zu erledigen. Wie mache ich das?Verwenden Sie Tornado Async-Code in einem regulären Python-Skript
from tornado import gen
import some_internal_stuff
@gen.coroutine
def myfunc(x):
y = yield some_internal_stuff.another_async_func(x)
raise gen.Return(y)
if __name__ == "__main__":
# What do I put here to call myfunc(1) and get the async return value?
pass
Update:
Ein konkreteres Beispiel:
from tornado import gen
@gen.coroutine
def another_async_func(x):
print "aaf"
raise gen.Return(x + 1)
@gen.coroutine
def myfunc(x):
print "myfunc"
y = yield another_async_func(x)
print "back"
raise gen.Return(y)
def callback(y):
print "Callback called with %d" % y
if __name__ == "__main__":
myfunc(1, callback=callback)
Ausführen dieser Ausgänge:
myfunc
aaf
Leider eine solche offensichtliche Frage zu fragen, aber was hindert Sie daran some_internal_stuff.another_async_func Aufruf (x) direkt und auf das Ergebnis warten? Hat die Funktion, die Sie aufrufen, Abhängigkeiten von Tornado, die das verhindern? –
@rod: Die Idee ist, dass 'another_async_func' eine weitere Tornado' @ asynchrone' Methode ist, die normalerweise bei einem Tornado 'IOLoop' läuft. Ich könnte 'another_async_func' ausführen und einen' callback' übergeben, aber ohne Tornado läuft die Zeile nach dem yield in 'myfunc' niemals, und der Callback, den ich übergeben habe, wird nicht aufgerufen. – rakslice