Lua 的 Coroutine 模块

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

#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 函数进行关闭。

示例

-- 定义函数,作为协程的入口函数
function coMain(x, y)
    print("co-body", x, y)
    x,y = coroutine.yield(x + y) -- 让出协程
    print("co-body", x, y)
    x,y = coroutine.yield(x + y) -- 让出协程
    print("co-body", x, y)
    return 'end'                 -- 结束
end

-- 创建协程
local co = coroutine.create(coMain)

-- 多次启动协程
print("main", coroutine.resume(co, 1, 10))
print("main", coroutine.resume(co, 5, 9))
print("main", coroutine.resume(co, 3, 7))
print("main", coroutine.resume(co, 9, 9))

运行代码

Establishing WebAssembly Runtime.

Standby.

Powered by Shift.

#coroutine.create

coroutine.create (f)

说明

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

参数

  • f - 协程的入口函数

返回值

  • 返回创建的协程对象

#coroutine.close

coroutine.close (co)

说明

关闭对象。

参数

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

返回值

#coroutine.resume

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

说明

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

参数

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

返回值

#coroutine.yield

coroutine.yield (···)

说明

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

参数

返回值

#coroutine.wrap

coroutine.wrap (f)

说明

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

参数

  • f - 协程的入口函数

返回值

  • 协程的恢复函数

#coroutine.isyieldable

coroutine.isyieldable ([co])

说明

判断协程是否可以让出。

参数

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

返回值

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

#coroutine.running

coroutine.running ()

说明

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

参数

返回值

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

#coroutine.status

coroutine.status (co)

说明

获取协程的状态。

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

参数

  • co - 要检查的协程

返回值

  • 字符串形式的协程状态

#推荐阅读

Coroutine Manipulation - Lua 5.4 Reference Manual


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

相关文章
|
8天前
|
人工智能 前端开发 IDE
仅凭几张图片,我们是如何让 AI 自动生成 70% 可用前端代码的?
本文系统总结了在仅有 UI 图片、无设计稿和交互说明的情况下,如何通过 AI 技术实现高质量前端代码自动生成。
仅凭几张图片,我们是如何让 AI 自动生成 70% 可用前端代码的?
|
27天前
|
机器学习/深度学习 监控 安全
实验室监控的实时目标检测系统|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
基于YOLOv8与PyQt5的实验室实时监控系统,支持人员进出检测、未穿防护服报警、视频回放等功能。提供完整源码、数据集、权重文件及训练教程,开箱即用,可快速部署于实验室安全监管场景,实现智能可视化管理。
实验室监控的实时目标检测系统|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
|
25天前
|
人工智能 安全 云计算
中国银联基于通义千问打造金融支付垂域大模型
中国银联携手阿里云,基于通义千问打造金融支付大模型,依托AI技术推动支付清算、风控反欺诈等环节智能化升级,共建安全高效的大模型应用范式,助力金融行业高质量发展。
167 2
中国银联基于通义千问打造金融支付垂域大模型
|
10天前
|
安全 Linux 网络安全
Linux下搭建L2TP/IPsec VPN服务(手把手教你配置安全远程连接)
本教程详细介绍如何在Ubuntu 22.04上搭建L2TP/IPsec VPN服务器,涵盖软件安装、IPsec与xl2tpd配置、用户添加、防火墙设置及连接测试,适合初学者快速掌握Linux下安全的VPN搭建方法。
|
26天前
|
数据采集 API 数据处理
Python异步编程入门:告别卡顿,提升程序效率
Python异步编程入门:告别卡顿,提升程序效率
196 114
|
20天前
|
机器学习/深度学习 人工智能 监控
番茄叶片病害检测数据集(千张图片已划分)| AI训练适用于目标检测任务
在农业领域,植物病害检测是确保作物健康和提高农业生产效率的关键任务之一。随着计算机视觉技术的快速发展,基于深度学习的目标检测方法成为了病害识别的主流手段。为此,专门针对番茄叶片病害检测任务,我们推出了一个经过精心设计的番茄叶片病害检测数据集。该数据集包含了10,853张带标签的图像,覆盖了10种常见的番茄叶片病害类型,支持YOLO等先进的目标检测模型训练,旨在帮助研究人员和开发者提高农作物病害自动化检测的能力。
296 40
番茄叶片病害检测数据集(千张图片已划分)| AI训练适用于目标检测任务
|
12天前
|
机器学习/深度学习 数据采集 前端开发
Python 开发技术栈梳理:从数据库、爬虫到 Django 与机器学习
很多Python开发者学习碎片化,缺乏系统性。本文整理了一套从基础语法到全栈开发的完整学习资源,涵盖Python核心、数据库、前端、爬虫、Django框架、机器学习与算法,助你构建完整技术体系,适合进阶提升。
102 11
|
29天前
|
存储 弹性计算 JSON
如何让Agent更符合预期?基于上下文工程和多智能体构建云小二Aivis的十大实战经验
阿里云“云小二Aivis”项目聚焦Multi-Agent数字员工构建,分享十大Agent优化经验:从清晰预期、上下文精准投喂到记忆管理与HITL实践,助力提升Agent稳定性与智能化水平。
如何让Agent更符合预期?基于上下文工程和多智能体构建云小二Aivis的十大实战经验
|
13天前
|
监控 测试技术 API
避免人为漏测:Dify工作流成为你的“测试策略大脑”,全天候在线排查
本文介绍如何利用Dify工作流构建自动化测试分析系统,通过解析代码变更智能生成测试策略。该系统可集成至CI/CD流程,实现7x24小时风险识别与测试重点推荐,有效提升测试覆盖率和问题预防能力。

热门文章

最新文章