news 2026/4/30 13:46:09

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/5/1 5:54:11

百度网盘提取码智能获取工具完整使用指南

百度网盘提取码智能获取工具完整使用指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为繁琐的百度网盘提取码而困扰吗?每次获取分享资源都要经历复制链接、寻找提取码、手动输入的重复过程,这种…

作者头像 李华
网站建设 2026/5/1 5:53:46

你,宇宙唯一的中心:在无限复刻中活出绝对的存在

你,宇宙唯一的中心:在无限复刻中活出绝对的存在 一、宣言:你的坐标是(0,0,0) 此刻,当你阅读这些文字时,请暂停一秒——无论你身处拥挤的地铁、深夜的书房,还是异国街头的咖啡馆——请深深地感受&#xff1a…

作者头像 李华
网站建设 2026/5/1 5:54:13

ConcurrentLinkedQueue实战:电商秒杀系统的队列选型优化

ConcurrentLinkedQueue:高性能无界非阻塞队列深度解析一、核心价值与应用场景在并发编程的世界中,线程安全队列是最基础的并发组件之一。Java并发包提供了两种主要类型的线程安全队列:阻塞队列和非阻塞队列。ConcurrentLinkedQueue作为后者的…

作者头像 李华
网站建设 2026/5/1 5:53:44

downkyi下载优先级终极指南:让你的重要视频先人一步

你是否曾经遇到过这样的烦恼:急需观看的学习视频排在下载队列末尾,而不太重要的娱乐内容却占据了宝贵的下载带宽?downkyi的智能优先级系统正是为了解决这一痛点而设计,让你能够完全掌控视频下载的执行顺序。 【免费下载链接】down…

作者头像 李华
网站建设 2026/5/1 5:54:12

中望CAD2025:将多段线转换为样条曲线

方法一: 双击多段线或者输入命令【pedit】,在弹出的菜单栏中选择【样条曲线(S)】,将普通多段线转换为样条曲线拟合的多段线;方法二: 编辑多段线——样条曲线

作者头像 李华
网站建设 2026/5/1 5:54:52

AI如何帮你解决MySQL的--skip-grant-tables问题

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个AI辅助工具,能够自动检测MySQL服务器是否以--skip-grant-tables选项运行。当检测到该模式时,工具应提供以下功能:1) 解释此模式的安全风…

作者头像 李华