Python 在调用堆栈中使用tornado协程

Python 在调用堆栈中使用tornado协程,python,tornado,Python,Tornado,我是龙卷风的新手,对龙卷风的合作有一些疑问。 如果我有一个调用堆栈,则如下所示: func_a => func_b => func_c => func_d func_d是一个异步函数,我使用yield和@gen.coroutine decorator。 就这样, @gen.coroutine def redis_data(self, id): ret = yield asyn_function() raise gen.Return(ret) 我必须将yiel

我是龙卷风的新手,对龙卷风的合作有一些疑问。 如果我有一个调用堆栈,则如下所示:

func_a => func_b => func_c => func_d
func_d是一个异步函数,我使用yield和@gen.coroutine decorator。
就这样,

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

我必须将
yield
@gen.coroutine
func\u c
func\u b
func\u a
一起使用吗?

是的,您的coroutine的所有调用者也必须是coroutine,并且它们必须生成您的coroutine的结果

为什么??如果不执行yield语句,任何协同程序都不能执行I/O。看看你的代码:它可能需要和服务器对话吗?那么它必须屈服。它的调用者也必须如此,以此类推,这样最终您就屈服于事件循环。否则,循环无法进行,I/O也无法完成

这既是协程代码的技术要求,也是协程优于线程的优势。通过查看代码,您总能知道何时会被中断:

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


是的,所有协同路由的调用方也必须是协同路由,并且它们必须生成协同路由的结果

为什么??如果不执行yield语句,任何协同程序都不能执行I/O。看看你的代码:它可能需要和服务器对话吗?那么它必须屈服。它的调用者也必须如此,以此类推,这样最终您就屈服于事件循环。否则,循环无法进行,I/O也无法完成

这既是协程代码的技术要求,也是协程优于线程的优势。通过查看代码,您总能知道何时会被中断:

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


这是否意味着函数a、b、c是同步函数?同步的,如果函数a、b、c是同步的,有什么区别吗?这是否意味着函数a、b、c是同步函数?同步的,如果函数a、b、c是同步的,有什么区别吗?@tyouicn还有什么我可以帮你的吗,或者你会在堆栈溢出时接受我的回答为“正确”吗?这仍然不是真的,因为有
wait
关键字,对吗?我认为现在可以用wait来代替yield,但我发现文档在这方面相当混乱,所以我不确定。所有协同路由调用方都必须是协同路由。您可以使用“async def”和“await”来定义协同路由,也可以在Python 3.4及更早版本中使用“gen.coroutine”和“yield”来定义它们。请看@tyouicn还有什么我可以帮你的吗,或者你会接受我关于堆栈溢出的回答为“正确”吗?这仍然不成立,因为有
wait
关键字,对吗?我认为现在可以用wait来代替yield,但我发现文档在这方面相当混乱,所以我不确定。所有协同路由调用方都必须是协同路由。您可以使用“async def”和“await”来定义协同路由,也可以在Python 3.4及更早版本中使用“gen.coroutine”和“yield”来定义它们。看见