简体   繁体   中英

use tornado coroutine in call stack

I am new to tornado and have some questions about tornado's coroutine. if i have a call stack looks like:

func_a => func_b => func_c => func_d

and func_d is an asynchronous function and I use yield and @gen.coroutine decorator.
just like this:

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

Must I use yield and @gen.coroutine with func_c , func_b and func_a ?

Yes, all your coroutine's callers must also be coroutines, and they must yield the result of your coroutine.

Why? No coroutine can do I/O without executing a yield statement. Look at your code: might it need to talk to the server? Then it must yield. So must its caller, and so on up the chain, so that ultimately you have yielded to the event loop. Otherwise the loop cannot make progress and the I/O does not complete.

This is both a technical requirement of coroutine code, and an advantage of coroutines over threads. You always know by looking at your code when you can be interrupted:

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

For more on refactoring coroutines, see:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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