Nein, in der Tat sind Sie garantiert, dass alle Funktionen hervorgebracht werden, bevor eine von ihnen zu laufen beginnt, weil first
nicht yield
zwischen Laich tut func
und Laich func2
. Sie können dies selbst überprüfen, indem Sie den Code zu testen:
from tornado import gen, ioloop
@gen.coroutine
def func():
print('func started')
yield gen.moment
print('func done')
@gen.coroutine
def func2():
print('func2 started')
yield gen.moment
print('func2 done')
@gen.coroutine
def first():
for i in range(2):
ioloop.IOLoop.current().spawn_callback(func)
ioloop.IOLoop.current().spawn_callback(func2)
yield gen.sleep(1)
ioloop.IOLoop.current().run_sync(first)
Er druckt:
func started
func started
func2 started
func done
func done
func2 done
See, func2
beginnt, bevor die Koroutinen func
vollständig ausgeführt wird.
Um das zu erreichen, was Sie wollen:
@gen.coroutine
def first():
yield [func() for i in range(2)]
ioloop.IOLoop.current().spawn_callback(func2)
Diese Drucke:
func started
func started
func done
func done
func2 started
func2 done
Wenn Sie first
wollen func2
warten zu beenden, bevor es beendet wird, dann:
@gen.coroutine
def first():
yield [func() for i in range(2)]
yield func2()
Weitere Informationen zum Aufrufen von Coroutinen aus Coroutinen finden Sie unter Refactoring Tornado Coroutines.
Danke, dass Sie sich die Zeit genommen haben zu schreiben, dass Jesse sehr geschätzt hat. –