繁体   English   中英

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

[英]use tornado coroutine in call stack

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

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吗?

是的,您所有的协程调用者也必须是协程,并且它们必须产生协程的结果。

为什么? 如果不执行yield语句,协程将无法执行I / O。 查看您的代码:是否需要与服务器对话? 然后它必须屈服。 它的调用方也必须如此,如此等等,以便最终您屈服于事件循环。 否则,循环将无法进行,并且I / O无法完成。

这既是协程代码的技术要求,也是协程相对于线程的优势。 当您被打断时,通过查看代码始终可以知道:

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

有关重构协程的更多信息,请参见:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM