Lua 的 Coroutine 模块

作者:hubenchang0515日期:2025/11/13

#Lua 的 Coroutine 模块

请查看 Lua 标准库模块列表 了解更多相关 API。

函数说明
coroutine.create创建协程对象
coroutine.close 关闭协程对象
coroutine.resume恢复协程
coroutine.yield让出协程
coroutine.wrap创建协程对象,返回一个恢复函数
coroutine.isyieldable检查协程能否让出
coroutine.running获取正在运行的协程对象
coroutine.status获取协程状态

Lua 支持协同程序(也称为协作多线程)。Lua 中的协程代表一个独立的执行线程。与多线程系统中的线程不同,协程不能被抢占,只能通过显式调用 coroutine.yield 函数来主动让出。

通过调用 coroutine.create 函数创建协程。它的唯一参数是协程的入口函数;coroutine.create 函数仅创建一个新的协程并返回该对象,而不会启动该协程。

通过调用 coroutine.resume 函数来执行协程。首次调用时,它的第一个参数是 coroutine.create 返回的协程对象,之后的参数传递给协程入口函数。

通过调用 coroutine.yield 函数来让出协程。让出时 coroutine.resume 返回 truecoroutine.yield 的所有参数。

让出状态下的协程可以调用 coroutine.resume 来恢复执行。协程恢复时从此前让出时调用 coroutine.yield 函数的位置继续执行,coroutine.yield 返回 coroutine.resume 除了第一个参数以外的所有参数。

协程入口函数结束时,其返回值从 coroutine.resume 返回,该协程无法再次启动,需要调用 coroutine.close 函数进行关闭。

示例

1-- 定义函数,作为协程的入口函数
2function coMain(x, y)
3    print("co-body", x, y)
4    x,y = coroutine.yield(x + y) -- 让出协程
5    print("co-body", x, y)
6    x,y = coroutine.yield(x + y) -- 让出协程
7    print("co-body", x, y)
8    return 'end'                 -- 结束
9end
10
11-- 创建协程
12local co = coroutine.create(coMain)
13
14-- 多次启动协程
15print("main", coroutine.resume(co, 1, 10))
16print("main", coroutine.resume(co, 5, 9))
17print("main", coroutine.resume(co, 3, 7))
18print("main", coroutine.resume(co, 9, 9))
19

运行代码

Establishing WebAssembly Runtime.

Standby.

Powered by Shift.

#coroutine.create

1coroutine.create (f)
2

说明

创建一个新的协程,返回该协程对象。

参数

  • f - 协程的入口函数

返回值

  • 返回创建的协程对象

#coroutine.close

1coroutine.close (co)
2

说明

关闭对象。

参数

  • co - 要关闭的协程,必须处于暂停(让出)或死亡(结束)状态

返回值

#coroutine.resume

1coroutine.resume (co [, val1, ···])
2

说明

启动或继续执行协程,不能用于已经死亡(结束)的协程。

参数

  • co - 要执行的协程
  • val1, ... - 传递给协程的参数,启动时传递给协程入口函数,恢复时通过 coroutine.yield 返回

返回值

#coroutine.yield

1coroutine.yield (···)
2

说明

让出(暂停)当前协程的执行。

参数

返回值

#coroutine.wrap

1coroutine.wrap (f)
2

说明

创建一个新的协程,返回该协程的恢复函数,每次调用该函数时都会恢复该协程。

参数

  • f - 协程的入口函数

返回值

  • 协程的恢复函数

#coroutine.isyieldable

1coroutine.isyieldable ([co])
2

说明

判断协程是否可以让出。

参数

  • co - 要判断的协程;默认值为正在运行的协程

返回值

  • 可以让出时返回 true
  • 不可让出时返回 false

#coroutine.running

1coroutine.running ()
2

说明

获取正在运行的协程对象。

参数

返回值

  • 返回正在运行的协程对象及该协程是(true)否(false)是主协程

#coroutine.status

1coroutine.status (co)
2

说明

获取协程的状态。

状态说明
"running"协程正在运行
"suspended"协程被挂起(未启动或被 yield 让出)
"normal"协程处于活动状态但并非正在运行(该协程中 resume 了另一个协程)
"dead"协程死亡(入口函数已经结束)

参数

  • co - 要检查的协程

返回值

  • 字符串形式的协程状态

#推荐阅读

Coroutine Manipulation - Lua 5.4 Reference Manual


Lua 的 Coroutine 模块》 是转载文章,点击查看原文


相关推荐


Node.js 开发环境搭建全攻略(2025版)
Java私教2025/11/11

本文将详细介绍如何在本地搭建一个高效、可维护的 Node.js 开发环境,适用于 Windows、macOS 与 Linux。无论你是后端新手还是资深全栈工程师,都能通过本文快速构建一个标准化的 Node.js 开发环境。 一、什么是 Node.js? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,它让开发者可以在服务器端运行 JavaScript。 它以 事件驱动、非阻塞 I/O 的特性著称,非常适合构建高性能的 Web 服务和微服务架构。 二、安


类比前端知识来学习Java的Spring Boot实现MySql的全栈CRUD功能——搭配Svelte+Vite
水冗水孚2025/11/9

前言 本文梳理了后端的相关操作流程环节 使用Svelte+Vite(前端)搭配Spring Boot(后端) 实现了一个增删改查全栈项目 有助于前端更好理解后端java的分层思想,数据流转控制 和Svelte尝鲜学习了解 完整前后端代码在github:github.com/shuirongshu… 大道至简,一些知识点是相通的比如——python里面也有闭包这个概念 所谓编程即:学习规则语法、理解规则语法、合理运用规则语法、从而自定义规则... Java、Spring、Spring Bo


Bash 的 if 条件语句
hubenchang05152025/11/7

#Bash 的 if 条件语句 Bash 的 if 条件语句的语法为: if 条件命令 then 命令 ... elif 条件命令 then 命令 ... else 命令 ... fi 其中,条件命令返回成功(0)时为真(true),返回失败(非 0)时为假(false)。 如果省略(部分)换行,则需要使用分号(;)区分: if 条件命令; then 命令; 命令; elif 条件命令; then 命令; 命令; else 命令; 命令; fi


hive的SQL练习3
普通网友2025/11/3

根据如上表格信息,实现如下需求: 查询五一期间(2023-05-01 ~ 2023-05-07),每个餐厅的订单总数量及排名with t as ( select *,        count(1) over(partition by restaurant_id) countNum        from orders where substr(order_date,1,10)     between '2023-05-01' and '2023-05-07' ) select d


游戏盾是如何保障游戏安全稳定的
上海云盾第一敬业销售2025/10/31

上海云盾SDK游戏盾是如何保障游戏安全稳定的 防攻击保流畅:游戏服务器易遭受 UDP Flood、CC 攻击等针对性威胁,这类攻击会导致服务器负载过高,引发玩家掉线、操作卡顿。游戏盾能深度解析游戏协议,快速识别攻击流量并进行清洗,同时依托多节点部署,将攻击流量引流至防护节点,避免源服务器受冲击,确保游戏全程流畅不中断。 阻外挂护公平:外挂、作弊脚本会破坏游戏内平衡,导致合规玩家失去兴趣,损害游戏生态。游戏盾内置外挂检测机制,可实时监控异常行为,如数据篡改、加速作弊等,通过特征匹配与行为分


前端别再乱存数据了!这3种存储方案让你的应用快如闪电
良山有风来2025/10/28

你是不是也遇到过这样的场景? 用户刚填完一个超长的表单,不小心刷新了页面,所有数据都没了... 从接口请求的数据,用户每次操作都要重新加载,体验卡成PPT... 应用离线状态下完全无法使用,用户直接流失... 别担心!今天我就带你彻底解决这些问题。看完这篇文章,你将掌握一套完整的数据交互方案,让你的应用在任何网络状态下都能流畅运行。 为什么数据存储这么重要? 想象一下,你去超市购物,每次想买什么东西,都要跑回家查一下购物清单,然后再跑回超市... 这得多累啊! 网页应用也是同样的道理。合理的数据


Bash 的变量
hubenchang05152025/10/25

#Bash 的变量 Bash 中的变量定义语法如下: 变量名=值 注意,等号(=)两边不能有空格。 变量名的命名应当遵循如下规则: 只能包含字母,数字和下划线(_),并且不能以数字开头。 不能使用 Bash 保留的关键字,如:if then else fi for while do done 等 环境变量和常量使用全大写字母,单词间使用下划线分隔 普通变量使用全小写字母,单词间使用下划线分隔 函数内的局部变量使用 local 关键字声明 例如: PI=3.1415925 URL="htt


搜索百科(5):Easysearch — 自主可控的国产分布式搜索引擎
极限实验室2025/10/23

大家好,我是 INFINI Labs 的石阳。 欢迎关注 《搜索百科》 专栏!每天 5 分钟,带你速览一款搜索相关的技术或产品,同时还会带你探索它们背后的技术原理、发展故事及上手体验等。 在上一篇我们介绍了 OpenSearch —— 那个因协议争议而诞生的开源搜索分支。今天,我们把目光转向国内,聊聊极限科技研发的一款轻量级搜索引擎:Easysearch。 引言 在搜索技术的世界里,从 Lucene 的出现到 Solr、Elasticsearch 的崛起,搜索引擎技术已经发展了二十余年。然而,随


Swift 字符串与字符完全导读(一):从字面量到 Unicode 的实战之旅
unravel20252025/10/22

前言 Swift 的 String 看起来“像 NSString 的弟弟”,但骨子里是一套全新的 Unicode 抽象模型。 String 与 Character 的本质 String:由“扩展字形簇”(extended grapheme cluster)构成的有序集合。 Character:一个扩展字形簇,人类眼中的“一个字符”,占用的字节数可变。 // 1 个 Character,由 2 个 Unicode 标量合成 let eAcute: Character = "é"


JAVA面试复习笔记(待完善)
paishishaba2025/10/20

目录 布隆过滤器 一、核心思想 二、执行逻辑详解 1. 添加元素 2. 查询元素 三、为什么会有误判? 四、关键参数与性能权衡 五、执行逻辑总结与特点 六、典型应用场景 Redis 的 SETNX 命令 一、基本语法和语义 二、简单示例 三、SETNX 的核心特性 1. 原子性 2. 简单性 3. 无过期时间 四、经典应用场景 1. 分布式锁(最经典的应用) 五、SETNX 的局限性及改进方案 问题1:非原子性的设置过期时间 解决方案:使用 SET 命令

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读