龙卷风执行命令Spawn回调

时间:2016-08-01 10:06:34

标签: tornado

如果我有以下内容:

 @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()回调之前运行吗?

1 个答案:

答案 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