在调用堆栈中使用龙卷风协同程序

时间:2015-03-03 08:18:27

标签: python tornado

我是龙卷风的新手,对龙卷风的协程有一些疑问。 如果我有一个调用堆栈看起来像:

func_a => func_b => func_c => func_d

和func_d是一个异步函数,我使用yield和@ gen.coroutine装饰器 就像这样:

@gen.coroutine
def redis_data(self, id):
    ret = yield asyn_function()
    raise gen.Return(ret)

我必须将yield@gen.coroutinefunc_cfunc_bfunc_a一起使用吗?

1 个答案:

答案 0 :(得分:4)

是的,你所有的coroutine的来电者也必须是协同程序,并且他们必须产生你的协程的结果。

为什么呢?没有coroutine可以在不执行yield语句的情况下执行I / O.看看你的代码:它可能需要与服务器通信吗?然后它必须屈服。所以它的调用者,以及链上等等,所以最终你已经屈服于事件循环。否则循环无法进行,I / O也无法完成。

这既是协程代码的技术要求,也是协同程序在线程上的优势。当你被打断时,你总是通过查看你的代码来了解:

https://glyph.twistedmatrix.com/2014/02/unyielding.html

有关重构协同程序的更多信息,请参阅:

http://emptysqua.re/blog/refactoring-tornado-coroutines/