lua学习笔记(七)
2024-10-21 14:21:20
错误处理
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
可以使用一个协同程序负责主任务循环,判断其它协同程序状态,有闲置的就使其执行,实现多线程功能
最新文章
- 【jq】c#零基础学习之路(3)继承和虚方法
- 重启nginx
- APT 常用功能
- protocolbuffe
- Jquery Mobile设计Android通讯录第二章
- HDU 5727 Necklace 环排+二分图匹配
- linux下搭建svn服务器
- JUnit报initializationError的解决方法
- HBase面试问题
- ERP行业推荐参考书籍
- Javascript继承(暂略去中转函数、组合继承和寄生继承)
- 【原创】EntityFramework Core 中使用 CodeFirst 模式时 PowerShell 版本问题及解决
- phpmyadmin低权限getshell
- 八、.net core 通过数据库配置文件连接操作数据库
- Bean Shell常用内置变量总结
- 第三章 JQuery: HelloWorld--常见方法--css--选择器--筛选器--属性--效果--事件--数组操作--字符串操作--对象转换
- plsql调试存储过程卡住的原因以及处理
- js数组作为参数用ajax向后台传参数
- 基于Centos搭建 Discuz 论坛
- Ubuntu 编译安装 nDPI
热门文章
- schema get_ddl
- Xamarin.Android真机测试提示[INSTALL_FAILED_UPDATE_INCOMPATIBLE]
- python3 全栈开发 -- 面向对象 类的组合和封装
- 十. 图形界面(GUI)设计4.面板
- SQL表操作习题5 26~35题
- QQ协议
- strace 使用案例
- BeanUtils——JavaBean相互转换及字典翻译
- Get Started with Subversion using SvnX
- xpath节点匹配简易教程