簡體   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