news 2026/2/22 11:06:14

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/2/21 16:12:18

编辑相似度(Edit Similarity):原理、演进与多模态扩展

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 1 引言 在人工智能与机器学习领域,衡量两个数据对象之间的…

作者头像 李华
网站建设 2026/2/20 21:11:30

【深度解析】MiniCPM 2.0:端侧大模型的技术性进展与技术革新

2024年9月5日,MiniCPM团队正式发布了备受瞩目的端侧语言大模型系列——MiniCPM 2.0的技术报告。作为一款聚焦于终端设备部署的轻量化大模型,MiniCPM 2.0在保持模型小巧体积的同时,实现了性能的跨越式提升,为人工智能在边缘计算领域…

作者头像 李华
网站建设 2026/2/21 9:49:40

ClickHouse 快速入门

ClickHouse 快速入门1 ClickHouse 介绍1 行式存储VS列式存储2 ClickHouse VS MySQL3 ClickHouse VS Apache Doris4 ClickHouse 的优缺点5 ClickHouse 适用的场景2 ClickHouse 安装1 镜像下载2 容器运行3 创建用户3 ClickHouse 连接1 连接2 建表测试4 SpringBoot 集成 ClickHous…

作者头像 李华
网站建设 2026/2/22 5:51:02

基于SpringBoot的人事管理系统设计与实现

基于SpringBoot的人事管理系统设计与实现 基于SpringBoot的人事管理系统:毕业设计优质资源全解析 在当今数字化时代,企业人力资源管理正经历着从传统手工操作向智能化、自动化转型的关键阶段。对于计算机科学和软件工程专业的学生而言,一个…

作者头像 李华
网站建设 2026/2/20 22:01:35

Day36官方文档的阅读

官方文档咋找? 常用渠道是项目的 GitHub 仓库(一般会有docs文件夹),或者工具 / 框架的官方网站。 看文档的注意点 必须保证你安装的工具包版本,和看的文档版本一致!不然可能出现 “文档写了 A 功能&#x…

作者头像 李华