news 2026/3/27 19:57:47

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/3/14 10:03:59

MySQL进阶篇——InnoDB存储引擎和管理

InnoDB存储引擎逻辑存储结构表空间(.ibd文件)-段-区-页-行一个mysql实例对应多个表空间,用于存储记录,索引等数据;段:分为数据段(B树叶子节点)、索引段(B树非叶子节点)、回滚段区&am…

作者头像 李华
网站建设 2026/3/27 11:16:35

单例设计模式

饿汉式单例:在用类前创建好对象,用的时候直接用。懒汉式单例:在用类的时候才创建对象,不提前创建。共同点:两种方式均通过私有化构造函数防止外部直接实例化,并通过静态方法或静态变量提供唯一实例的访问入…

作者头像 李华
网站建设 2026/3/26 3:51:46

百度网盘智能提取码解决方案:技术驱动的自动化访问新体验

百度网盘智能提取码解决方案:技术驱动的自动化访问新体验 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在数字化资源获取的日常场景中,百度网盘提取码的查找过程往往成为用户体验的瓶颈环节。传统的手…

作者头像 李华
网站建设 2026/3/24 11:05:43

Windows右键菜单终极清理指南:5步打造高效桌面体验

Windows右键菜单终极清理指南:5步打造高效桌面体验 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager Windows右键菜单是日常操作中使用频率最高的功能之…

作者头像 李华
网站建设 2026/3/26 14:56:13

Spring Boot 权限控制三件套:JWT 登录校验 + 拦截器 + AOP 角色注解实战

文章目录接口校验,权限拦截通过自定义注解,基于面向切面编程来实现1. 自定义异常2. 自定义注解3. AOP面向切面类4. Controller层使用统一异常处理和信息返回1. 创建统一信息返回类2. 创建全局统一异常处理类3. 创建一个枚举类型4. 创建自定义的异常类拦截…

作者头像 李华
网站建设 2026/3/24 17:55:04

Python验证码处理实战:从12306项目看验证码识别的技术演进

一、引言:验证码,网络安全的第一道防线 在网络应用中,验证码是防止自动化攻击的重要手段。12306作为中国铁路售票系统,其验证码设计尤为复杂,从早期的数字字母组合,到后来的图片点击,再到如今的…

作者头像 李华