• lua学习笔记(七)


    错误处理

      assert(exp)
      error("error message text")
      pcall安全调用
    协同程序
      lua没有真正的多线程,都是使用协同程序也实现的多线程
      lua是非对称式协同程序(semi-coroutine),它提供两个函数来处理执行权
      任一时刻只能有一个协同程序在执行
      只能自己挂起自己才会停止工作,无法从外部停止其工作
      与生产者消费者模型一样互斥协同
      所有协同程序的函数放在coroutine的table里
      co = coroutine.create(function() print("wangning") end)
      assert(type(co)=="thread")
      create的参数就是协同程序执行的内容,返回一个thread类型的变量
      4种状态:挂起(suspended)、运行(running)、死亡(dead)、正常(normal)
      刚创建的协同程序处于挂起状态,可以用status检查状态
      assert(coroutine.status(co)=="suspended")
      coroutine.resume(co)用于启动或再次启动协同程序,将状态改为running
      当协同程序执行完成任务函数后处于dead状态
      在任务函数中使用coroutine.yield()可以挂起协同程序
      然后调用coroutine.resume()再次启动已挂起协同程序
      如果协同程序已经处于dead状态时,resume会返回false失败
      当协同程序A唤醒另一个协同程序B时,A将停止执行,换做B执行
      这时A的状态为正常状态normal
      可以使用resume和yield来交换数据
      第一次调用resume的额外参数(第二个以后的参数),都将视为协同程序任务函数的参数传入
      之后都将成为yield的返回值
      resume的第一个返回值表示成功失败,第二个以后的值都是yield的传入参数
      当协同程序的任务函数执行完成后,函数的返回值会成为resume的额外返回值
      co = coroutine.create(function(a,b,c)
          print(a,b,c)
          print(coroutine.yield(4,5,6))
          return 10
      end)
      res, a,b,c = coroutine.resume(co,1,2,3) --> 1 2 3
      print(res,a,b,c) --> true 4 5 6
      res, d = coroutine.resume(co, 7,8,9) --> 7 8 9
      print(res, d) --> true 10
      print(coroutine.resume(co)) --> false cannot resume dead coroutine
      可以使用一个协同程序负责主任务循环,判断其它协同程序状态,有闲置的就使其执行,实现多线程功能
     
  • 相关阅读:
    TFS实现需求工作项自动级联保存
    Oracle PL/SQL Developer集成TFS进行团队脚本文件版本管理
    TFS2017持续集成构建
    TFS 测试用例步骤数据统计
    精细化容量管理的设备成本优化之路
    腾讯Web工程师的前端书单
    React Native For Android 架构初探
    SQL系列(八)—— 分组(group by)
    SQL系列(七)—— 相似(like)
    SQL系列(六)—— 过滤(where)
  • 原文地址:https://www.cnblogs.com/lifesteven/p/4169374.html
Copyright © 2020-2023  润新知