Lua协程

  • Lua的协程

Lua的协程

  • 定义
    • 两个子过程通过相互协作完成某个任务,用它可以实现协作式多任务,
    • 协程(coroutine)技术本质上是一种程序控制机制
  • 分类
    • 对称协程(asymmetric)
      • 当前协程将控制权让给另外一个协程,协程之间的优先级是平等的
    • 非对称协程(symmetric)
      • 当前协程将控制权让给当前调用者
      • lua采用此类协程
  • 范例

    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

糖果

糖果
LUA教程

如果不小心安装错 SQL Server 为 Evaluation 的版本,要小心当超过 180 天之后,系统就会无法正常使用了 这几天遇到一个蛮特别的案例,原本收到的问题是 “维护计划” 忽然无法使用,即便是里面没有任何的Task,都无法顺利地执行。但从对方所提供的错误消...… Continue reading

PLUM NIZ静电容键盘怎么样?

Published on September 25, 2020

程序员如何选择合适的机械键盘

Published on September 18, 2020