当前位置: 首页 > news >正文

Lua协同程序Coroutine

Lua 协同程序(Coroutine)

定义

Lua 协同程序(Coroutine)与线程类似:拥有独立的堆栈、局部变量、指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。

协同程序可以理解为一种特殊的线程,可以暂停和恢复其执行,从而允许非抢占式的多任务处理。协同是非常强大的功能,但是用起来也很复杂。

线程和协同程序区别

主要区别在于,一个程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。
在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。

线程协程
调度方式操作系统进行抢占式调度非抢占式调度,由程序员控制
并发并发执行,同时运行多个协作运行,同时运行一个
内存占用独立堆栈,开销大共享堆栈、开销小
数据共享共享内存空间通过参数传递
调试难以调试相对简单

使用

协同程序由 coroutine 模块提供支持。

方法描述
coroutine.create()创建 coroutine,返回 coroutine, 参数是一个函数,当和 resume 配合使用的时候就唤醒函数调用
coroutine.resume()重启 coroutine,和 create 配合使用
coroutine.yield()挂起 coroutine,将 coroutine 设置为挂起状态,这个和 resume 配合使用能有很多有用的效果
coroutine.status()查看 coroutine 的状态 注:三种状态:dead,suspended,running,
coroutine.wrap()创建 coroutine,返回一个函数,一旦你调用这个函数,就进入 coroutine,和 create 功能重复
coroutine.running()返回正在跑的 coroutine,一个 coroutine 就是一个线程,当使用running的时候,就是返回一个 coroutine 的线程号

代码示例

function foo()print("协同程序 foo 开始执行")local value = coroutine.yield("暂停 foo 的执行")print("协同程序 foo 恢复执行,传入的值为: " .. tostring(value))print("协同程序 foo 结束执行")
end-- 创建协同程序
local co = coroutine.create(foo)-- 启动协同程序
local status, result = coroutine.resume(co)
print(result) -- 输出: 暂停 foo 的执行-- 恢复协同程序的执行,并传入一个值
status, result = coroutine.resume(co, 42)
print(result) -- 输出: 协同程序 foo 恢复执行,传入的值为: 42

代码输出结果

协同程序 foo 开始执行
暂停 foo 的执行
协同程序 foo 恢复执行,传入的值为: 42
协同程序 foo 结束执行
nil
http://www.lryc.cn/news/436478.html

相关文章:

  • 【vue+帆软】帆软升级,从版本9升级到版本11,记录升级过程
  • linux从0到1 基础完整知识
  • “人大金仓”正式更名为“电科金仓”; TDSQL-C支持回收站/并行DDL等功能; BigQuery支持直接查询AlloyDB
  • 大模型微调 - 用PEFT来配置和应用 LoRA 微调
  • Ubuntu构建只读文件系统
  • 【黑金系】金融UI/UX体验设计师面试作品集 Figma源文件分享
  • Golang | Leetcode Golang题解之第392题判断子序列
  • Liunx常用指令
  • CSS基础:浮动(float)如何使用清楚以及代替方法
  • margin重叠该怎么解决?
  • Linux学习笔记(黑马程序员,前四章节)
  • tekton pipeline resources
  • 使用Python实现多个PDF文件的合并
  • 微擎忘记后台登录用户名和密码怎么办?解决方法
  • blender我的对称模型好像中点被我不小心移动了 我现在如果雕刻 两边修改的地方不是对称的 我该怎么办
  • 数据库——MySQL概述
  • 云服务器部署DB-GPT项目
  • 基于锂电池的多路直流电源模块设计
  • 蓝奏云网盘搜索网页版PHP源码
  • CocosCreator面试真题详解
  • 线性代数 第七讲 二次型_标准型_规范型_坐标变换_合同_正定二次型详细讲解_重难点题型总结
  • 国内外网络安全政策动态(2024年8月)
  • 重心映射:坐标系统与边界处理策略
  • python-网页自动化(二)
  • QT实战 商城客户端开发
  • 使用Java增删改查数据库
  • NAND发货量增长放缓,2024 Q2营收增长14%
  • 2024年9月13日 十二生肖 今日运势
  • Maven 常见问题以及常用命令
  • 自定义分区