错误处理

  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
  可以使用一个协同程序负责主任务循环,判断其它协同程序状态,有闲置的就使其执行,实现多线程功能
 

最新文章

  1. 【jq】c#零基础学习之路(3)继承和虚方法
  2. 重启nginx
  3. APT 常用功能
  4. protocolbuffe
  5. Jquery Mobile设计Android通讯录第二章
  6. HDU 5727 Necklace 环排+二分图匹配
  7. linux下搭建svn服务器
  8. JUnit报initializationError的解决方法
  9. HBase面试问题
  10. ERP行业推荐参考书籍
  11. Javascript继承(暂略去中转函数、组合继承和寄生继承)
  12. 【原创】EntityFramework Core 中使用 CodeFirst 模式时 PowerShell 版本问题及解决
  13. phpmyadmin低权限getshell
  14. 八、.net core 通过数据库配置文件连接操作数据库
  15. Bean Shell常用内置变量总结
  16. 第三章 JQuery: HelloWorld--常见方法--css--选择器--筛选器--属性--效果--事件--数组操作--字符串操作--对象转换
  17. plsql调试存储过程卡住的原因以及处理
  18. js数组作为参数用ajax向后台传参数
  19. 基于Centos搭建 Discuz 论坛
  20. Ubuntu 编译安装 nDPI

热门文章

  1. schema get_ddl
  2. Xamarin.Android真机测试提示[INSTALL_FAILED_UPDATE_INCOMPATIBLE]
  3. python3 全栈开发 -- 面向对象 类的组合和封装
  4. 十. 图形界面(GUI)设计4.面板
  5. SQL表操作习题5 26~35题
  6. QQ协议
  7. strace 使用案例
  8. BeanUtils——JavaBean相互转换及字典翻译
  9. Get Started with Subversion using SvnX
  10. xpath节点匹配简易教程