[英]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.coroutine
与func_c
, func_b
和func_a
吗?
是的,您所有的协程调用者也必须是协程,并且它们必须产生协程的结果。
为什么? 如果不执行yield语句,协程将无法执行I / O。 查看您的代码:是否需要与服务器对话? 然后它必须屈服。 它的调用方也必须如此,如此等等,以便最终您屈服于事件循环。 否则,循环将无法进行,并且I / O无法完成。
这既是协程代码的技术要求,也是协程相对于线程的优势。 当您被打断时,通过查看代码始终可以知道:
https://glyph.twistedmatrix.com/2014/02/unyielding.html
有关重构协程的更多信息,请参见:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.