coroutine#
- consign.decorator.coroutine(debug: bool = False, *, create_callback=None, complete_callback=None)[源代码]#
consign的核心,coroutine使得被修饰函数可以以协程的方式被执行
他的作用很简单,就是包裹函数,无论是普通函数还是生成器函数,使得consign得以运行他们
参见
普通函数的话,
coroutine
会生成一个包装好的生成器函数替代随后如同对待生成器函数一般使用
coroutine
修饰时在程序创建之初会创建ConsignOrder
并记录在order属性在每次调用时创建
Task
,同时每次调用的返回值被Task
替代,你可以从其中获取更多信息被
coroutine
修饰的函数变成协程后,是非阻塞的,状态、返回值等都可以在Task
中获取coroutine
支持传入一些参数,其中比较特别是debug参数debug参数允许你在不修改代码的情况下,以代码原本的阻塞逻辑运行
coroutine
为修饰器而设计,但你也可以把它当作函数使用,但这也会使得ConsignOrder
被不停重复创建而效率低下yield是 控制权转移 的关键 ,consign在单线程下依旧以 并发 的形式运行,关键就在于yield。
被
coroutine
修饰的函数最好是生成器函数,且 尽可能的切分函数控制权 提高控制权转换的频率def do_something_x(): io.sleep(long long time) return something @coroutine def my_function(): a = do_something_1() b = do_something_2() return a, b
def do_something_x(): io.sleep(long long time) return something @coroutine def my_function(): a = yield do_something_1() b = yield do_something_2() return a, b
@coroutine def do_something_x(): yield io.sleep(long long time) return something @coroutine def my_function(): a = yield do_something_1() b = yield do_something_2() wait(a) or chain_reaction(do_something_x) return a, b
- 参数
debug (bool) –
如果为True,
coroutine
允许你在不修改代码的情况下,以代码原本的阻塞逻辑运行如果是非生成器函数直接运行并返回结果
如果是生成器函数会以一个模拟普通函数的函数 代替运行 并返回结果
create_callback (function) –
创建协程函数时执行的回调函数,
create_callback
在协程函数执行前执行create_callback
需要一个参数用于接收此次运行时的Task
complete_callback (function) –
完成协程函数时执行的回调函数,
complete_callback
在协程函数获取到返回值后执行,但此时协程函数状态并非完成complete_callback
需要一个参数用于接收此次运行时的Task
- 返回