news 2026/6/10 14:00:08

Lua 的 Coroutine(协程)模块

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Lua 的 Coroutine(协程)模块

基本概念

Lua 的 Coroutine(协程)是一种轻量级的线程,它允许程序在单个线程中实现多个执行流的协作式调度。与操作系统线程不同,协程是完全由用户控制的,在用户态进行切换,不需要内核参与。

核心功能

创建协程

co=coroutine.create(function()print("协程开始执行")end)

启动/恢复协程

coroutine.resume(co)-- 输出:"协程开始执行"

挂起协程

co=coroutine.create(function()print("第一步")coroutine.yield()print("第二步")end)coroutine.resume(co)-- 输出:"第一步"coroutine.resume(co)-- 输出:"第二步"

状态管理

协程有以下几种状态:

  • suspended(挂起):刚创建或调用coroutine.yield后的状态
  • running(运行):正在执行的状态
  • dead(结束):函数执行完毕的状态

可以通过coroutine.status(co)查询协程状态。

数据交换

协程支持在coroutine.resumecoroutine.yield之间传递数据:

co=coroutine.create(function(x)print("收到:"..x)localy=coroutine.yield("返回1")print("收到:"..y)return"返回2"end)print(coroutine.resume(co,"输入1"))-- 输出:"收到:输入1" 和 "true 返回1"print(coroutine.resume(co,"输入2"))-- 输出:"收到:输入2" 和 "true 返回2"

应用场景

  1. 迭代器实现:可以用协程实现复杂的迭代逻辑
  2. 状态机:将状态转换逻辑封装在协程中
  3. 协作式多任务:在单线程中模拟多任务处理
  4. 游戏开发:处理角色AI、动画序列等
  5. 网络编程:实现非阻塞IO的协程调度

示例:生产者-消费者模式

functionproducer()returncoroutine.create(function()whiletruedolocalx=io.read()coroutine.yield(x)endend)endfunctionconsumer(prod)whiletruedolocalstatus,value=coroutine.resume(prod)ifnotstatusthenbreakendprint("消费:"..value)endendconsumer(producer())

注意事项

  1. 协程不是抢占式的,需要显式调用coroutine.yield让出执行权
  2. 协程的栈空间有限,深度递归可能导致栈溢出
  3. 协程间的数据共享需要注意同步问题
  4. 错误处理需要通过coroutine.resume的返回值判断

扩展阅读

Lua 5.3+ 版本对协程做了优化,性能更好。在 LuaJIT 中协程的执行效率更高,适合高性能场景。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 12:33:19

UDP网络巩固知识基础题(1)

1. UDP协议在接收端如何处理校验和错误的数据报?A. 自动重传请求 B. 丢弃数据报并通知发送端 C. 丢弃数据报但不通知发送端 D. 尝试纠正错误答案:C 解析: UDP是不可靠协议,当接收端检测到校验和错误时,直接丢弃该数据报…

作者头像 李华
网站建设 2026/6/10 0:57:35

day23 常见特征筛选算法

1.方差筛选 是最基础的过滤法:计算特征的方差,剔除方差极低的特征(这类特征数值变化小,对样本区分度弱)。优点是计算极快,缺点是只看特征自身,不考虑和目标的关联。 2.皮尔逊相关系数筛选 属于过滤法:计算特征与目标变量的皮尔逊相…

作者头像 李华
网站建设 2026/6/10 11:09:03

双塔emb模型的分类头

class SimpleConcatMLPHead(nn.Module):"""MLP分类头:使用多种交互特征,提升embedding效果"""def __init__(self,hidden_size: int,num_labels:

作者头像 李华
网站建设 2026/6/8 14:00:19

杂项设备驱动/应用层与内核层数据传输

声明:内容源于B站UP主——北京迅为电子一、简介字符设备:IO的传递传递过程是以字符设备为单位的,没有缓冲,比如I2C,SPI都是字符设备 块设备:IO传递过程是一块为单位的,跟存储相关的,都属于块设备…

作者头像 李华
网站建设 2026/6/9 23:30:11

百度网盘直链解析实战手册:突破限速封锁的完整解决方案

还在为百度网盘蜗牛般的下载速度而焦虑吗?当你急需下载重要文件,却只能眼睁睁看着几十KB/s的进度条缓慢爬行,那种无助感确实令人沮丧。现在,通过百度网盘直链解析工具的巧妙应用,你将彻底告别这种困境,实现…

作者头像 李华
网站建设 2026/6/10 14:34:09

Springboot医院门诊管理系统fcdrv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能:用户,医院简介,医生,科室信息,扣减金额,余额充值,用户钱包,就医指南,挂号预约,医生诊疗开题报告内容Spring Boot医院门诊管理系统开题报告一、选题依据(一)研究背景在医疗行业快速发展的当下,医院门诊作…

作者头像 李华