Lua协程
Lua的协程
- 定义
- 两个子过程通过相互协作完成某个任务,用它可以实现协作式多任务,
- 协程(coroutine)技术本质上是一种程序控制机制
- 分类
- 对称协程(asymmetric)
- 当前协程将控制权让给另外一个协程,协程之间的优先级是平等的
- 非对称协程(symmetric)
- 当前协程将控制权让给当前调用者
- lua采用此类协程
- 对称协程(asymmetric)
- 范例
local co = coroutine.create( function( first_param ) local result = "ok" print( "first_param = ", first_param ) local second_param = coroutine.yield( result ) print( "second_param = ",second_param ) return 1024 end ) print( "coroutine status = ", coroutine.status(co) ) local i, j = coroutine.resume( co, 1 ) print( i, j ) print( "coroutine status = ", coroutine.status(co) ) i, j = coroutine.resume( co, 2 ) print( i, j ) print( "coroutine status = ", coroutine.status(co) )
- 输出结果
coroutine status = suspended first_param = 1 true ok coroutine status = suspended second_param = 2 true 1024 coroutine status = dead
- 逻辑梳理
- 一个协程需要一个闭包(匿名函数)
- create后的协程状态为suspended
- 第一次唤醒协程时候传递的参数将作为匿名函数的入参
- yield第一次交出控制权,yield的参数作为当前协程的输出传递出来
- 第二次唤醒协程时候传递的参数,将通过yield的返回值作为协程的数据
- 在第一次调用了yield后,协程被挂起,类似阻塞
- 第二次调用resume后,放开阻塞,继续执行yield,并将外部传入参数作为yield返回值
- 当闭包完成时,协程状态变为dead
- 应用场景
- 同步原语写异步逻辑
- 没有协程之前,异步逻辑采用的是函数回调,需要保留上下文
- 编程思路会断断续续,需要在几个函数之间不停切换
- 协程自动保存了上下文,且让逻辑更加连续
- C++协程实现中,也是采用了系统函数进行上下文切换
- windows采用了CreateFiber、SwitchToFiber
- linux采用了makecontext、swapcontext
- 同步原语写异步逻辑