如果我有以下内容:
@tornado.gen.coroutine
def first(x):
#
# do stuff
for i in I:
tornado.ioloop.IOLoop.current().spawn_callback(func,i)
tornado.ioloop.IOLoop.current().spawn_callback(func2,z)
yield first(xxx)
我可以保证for
循环中的所有衍生函数都会在最后一次生成func2()回调之前运行吗?
答案 0 :(得分:7)
不,实际上您可以保证在任何函数开始运行之前生成所有函数,因为first
在生成yield
和生成func
之间不func2
}。您可以通过测试代码自行验证:
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)
打印:
func started
func started
func2 started
func done
func done
func2 done
请参阅func2
在协程运行func
之前开始。
完成你想要的任务:
@gen.coroutine
def first():
yield [func() for i in range(2)]
ioloop.IOLoop.current().spawn_callback(func2)
打印:
func started
func started
func done
func done
func2 started
func2 done
如果您希望first
在退出前等待func2
完成,则:
@gen.coroutine
def first():
yield [func() for i in range(2)]
yield func2()
有关从协同程序调用协同程序的更多信息,请参阅我的Refactoring Tornado Coroutines。