当前位置: 首页 > news >正文

Lua中协程相关函数使用详解

目录

  • 1. `coroutine.create(f)`
  • 2. `coroutine.resume(co [, val1, ...])`
  • 3. `coroutine.yield([val1, ...])`
  • 4. `coroutine.status(co)`
  • 5. `coroutine.wrap(f)`
  • 6. `coroutine.running()`
  • 7. `coroutine.isyieldable()`
  • 协程状态转换示例
  • 总结

Lua 中的协程(coroutine)提供了一种协作式多任务处理机制,允许在多个任务间切换执行。以下是协程相关函数的详细说明及使用示例:


1. coroutine.create(f)

  • 作用:创建一个新的协程,参数 f 是协程要执行的函数。
  • 返回值:返回协程对象(类型为 thread),协程初始状态为 suspended
  • 示例
    local co = coroutine.create(function()print("Hello from coroutine!")
    end)
    print(type(co))  --> thread
    

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

  • 作用:启动或恢复协程 co 的执行。首次调用时参数传递给协程函数;后续调用时参数作为 yield 的返回值。
  • 返回值
    • 第一个值为布尔值(表示是否成功执行)。
    • 后续值为协程中 yield 的参数或函数返回值。
  • 示例
    local co = coroutine.create(function(a, b)local sum = a + bcoroutine.yield(sum)return "done"
    end)print(coroutine.resume(co, 1, 2))  --> true, 3(第一次 resume,执行到 yield)
    print(coroutine.resume(co))         --> true, "done"(第二次 resume,执行到 return)
    

3. coroutine.yield([val1, ...])

  • 作用:挂起当前协程的执行,并将参数传递给 resume 的调用者。
  • 返回值:当协程恢复时,返回传递给 resume 的参数。
  • 示例
    local co = coroutine.create(function()print("Start")local x = coroutine.yield("yielded")print("Resumed with:", x)
    end)coroutine.resume(co)  --> 输出 "Start",返回 true, "yielded"
    coroutine.resume(co, 10)  --> 输出 "Resumed with: 10"
    

4. coroutine.status(co)

  • 作用:返回协程的状态,可能值为:
    • "suspended":挂起状态(可恢复)。
    • "running":正在运行。
    • "dead":执行完毕。
    • "normal":活跃但不在运行(例如正在恢复其他协程)。
  • 示例
    local co = coroutine.create(function() end)
    print(coroutine.status(co))  --> suspended
    coroutine.resume(co)
    print(coroutine.status(co))  --> dead
    

5. coroutine.wrap(f)

  • 作用:与 create 类似,但返回一个函数。调用该函数等同于调用 resume,但不会返回布尔值,错误时会直接抛出异常。
  • 示例
    local f = coroutine.wrap(function()coroutine.yield(1)return 2
    end)print(f())  --> 1
    print(f())  --> 2
    -- print(f())  --> 错误:attempt to call a dead coroutine
    

6. coroutine.running()

  • 作用:返回当前正在运行的协程及一个布尔值(表示是否为主协程)。
  • 示例
    local co = coroutine.create(function()print(coroutine.running())  --> thread:..., false(非主协程)
    end)
    print(coroutine.running())      --> thread:..., true(主协程)
    coroutine.resume(co)
    

7. coroutine.isyieldable()

  • 作用:检查当前协程是否可被挂起(yield)。在主线程或某些 C 函数中不可挂起。
  • 示例
    local co = coroutine.create(function()print(coroutine.isyieldable())  --> truecoroutine.yield()
    end)
    coroutine.resume(co)
    print(coroutine.isyieldable())      --> false(主线程中)
    

协程状态转换示例

  1. 创建协程:初始状态为 suspended
  2. 首次 resume:状态变为 running,执行到 yield 后回到 suspended
  3. 再次 resume:从 yield 处恢复,执行完毕变为 dead
local co = coroutine.create(function()print("Step 1")coroutine.yield()print("Step 2")
end)print(coroutine.status(co))  --> suspended
coroutine.resume(co)         --> 输出 "Step 1"
print(coroutine.status(co))  --> suspended
coroutine.resume(co)         --> 输出 "Step 2"
print(coroutine.status(co))  --> dead

总结

  • 协作式调度:协程需主动调用 yield 让出执行权。
  • 参数传递resume 的参数首次传递给协程函数,后续作为 yield 的返回值。
  • 错误处理:使用 wrap 时错误会抛出异常,而 resume 返回错误状态。
  • 状态管理:通过 statusisyieldable 检查协程状态和可操作性。

通过合理利用协程,可以实现非阻塞操作、生成器、状态机等复杂逻辑。

相关文章:

Lua中协程相关函数使用详解

目录 1. coroutine.create(f)2. coroutine.resume(co [, val1, ...])3. coroutine.yield([val1, ...])4. coroutine.status(co)5. coroutine.wrap(f)6. coroutine.running()7. coroutine.isyieldable()协程状态转换示例总结 Lua 中的协程(coroutine)提供…...

代码拟有感

最近的日子像被按了0.5倍速播放键。腱鞘炎让手腕转动时发出咯吱声,尾骨的钝痛让久坐变成酷刑,落枕的脖子和酸胀的手臂组成了“疼痛交响乐”——这些隐秘的、持续的身体抗议,让原本枯燥的代码练习变成了一场生理与意志的拉锯战。 我盯着屏幕苦…...

《实战AI智能体》MCP对Agent有哪些好处

首先MCP为Agent提供了标准化的方式来接入各种工具和数据源,无论是本地运行的工具,例如通过stdio服务器,还是远程托管的服务HTTP over SSE服务, Agent都可以通过统一的接口与它们进行交互,极大扩展了第三方工具库。 例如,在金融领域,Agent 可以接入股票分析的MCP工具。当…...

maptalks获取所有图层并把图层按照zIndex排序

maptalks获取所有图层并把图层按照zIndex排序 获取所有图层 通过调用 map.getLayers() 可以返回当前地图上所有的图层集合。此方法会返回一个数组形式的结果,其中包含了地图上的每一个图层层级对象。 图层属性中的 ZINDEX 每种图层类型(如矢量图层、…...

GUI-Guider 按钮按下 选项卡 右移动一个,到最右边停下

extern lv_ui guider_ui; // 在文件顶部添加// 在按钮事件中使用: lv_obj_t * tabview guider_ui.screen_tabview_1; // 替换为你的实际 TabView 名称 uint16_t current lv_tabview_get_tab_act(tabview); lv_tabview_set_act(tabview, current 1, LV_ANIM_ON); …...

让AI再次伟大-MCP-Client开发指南

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理、AI应用🔥如果感觉…...

sql工具怎么选?

为什么大多数主流工具又贵又难用? 有没有一款免费好用的sql工具? 像大多人朋友常用的sql工具,应该都遇到过这种情况, 用着用着收到了来自品牌方的律师函, 或者处理数据经常卡死, 再或者不支持国产数据库…...

video标签播放mp4格式视频只有声音没有图像的问题

video标签播放mp4格式视频只有声音没有图像的问题 这是由于视频格式是hevc(H265)编码的,这种编码格式视频video播放有问题主要是由于以下两种原因导致的: 1、浏览器没有开启硬加速模式: 开启方法(以谷歌浏览器为例)&a…...

问题解决:glog中的LOG(INFO)与VLOG无法打印

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 MotivationProcess glog版本为:https://github.com/google/glog/archive/…...

【第2月 day16】Matplotlib 散点图与柱状图

好的!以下是针对初学者的 Matplotlib 散点图与柱状图 学习内容,用简单易懂的语言和示例讲解: 一、散点图(Scatter Plot) 作用:展示两个变量之间的关系(如相关性、分布等)。 1. 核心…...

汽车 HMI 设计的发展趋势与设计要点

一、汽车HMI设计的发展历程与现状 汽车人机交互界面(HMI)设计经历了从简单到复杂、从单一到多元的演变过程。2012年以前,汽车HMI主要依赖物理按键进行操作,交互方式较为单一。随着特斯拉Model S的推出,触控屏逐渐成为…...

Vue 3 中按照某个字段将数组分成多个数组

方法一:使用 reduce 方法 const originalArray [{ id: 1, category: A, name: Item 1 },{ id: 2, category: B, name: Item 2 },{ id: 3, category: A, name: Item 3 },{ id: 4, category: C, name: Item 4 },{ id: 5, category: B, name: Item 5 }, ];const grou…...

06-Spring 中的事件驱动机制

Spring 中的事件驱动机制(ApplicationEvent 源码解析) 本小结主要总结Spring的事件,如果对于观察者模式比较熟悉的话,理解这个应该不难。 这块涉及的面试题相对简单,主要还是以日常使用为主。 另外在Spring的源码中也运…...

Python学习笔记(8)关于列表内置函数和多维列表

列表访问计数 索引直接访问 index()#获得首次出现指定元素的索引 index(value,[start,[end]] #控制搜索索引范围 counr()#获得指定元素在列表中出现的次数 len()#返回列表长度 成员资格判断 incount()返回0,代表不存在 列表切片 slice[起始偏移量 start:终止…...

【算法学习计划】回溯 -- 递归

目录 leetcode 面试题08.06.汉诺塔问题 leetcode 21.合并两个有序链表 leetcode 206.反转链表 leetcode 24.两两交换链表中的节点 leetcode 50. Pow(x, n) 本篇文章将是我们回溯专题的第一篇文章,在这里我先浅浅讲一下什么是回溯 其实就是递归,只不…...

Unity中 JobSystem使用整理

Unity 的JobSystem允许创建多线程代码,以便应用程序可以使用所有可用的 CPU 内核来执行代码,这提供了更高的性能,因为您的应用程序可以更高效地使用运行它的所有 CPU 内核的容量,而不是在一个 CPU 内核上运行所有代码。 可以单独使…...

【从零实现Json-Rpc框架】- 项目实现 - 服务端主题实现及整体封装

📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...

JavaScript基础-移动端常用开发框架

随着移动互联网的发展,越来越多的应用和服务需要支持移动设备。为了提高开发效率和用户体验,开发者们依赖于一些成熟的JavaScript框架来构建响应迅速、功能丰富的移动Web应用。本文将介绍几款广泛使用的移动端开发框架,并通过具体的示例展示它…...

Tree - Shaking

Vue 3 的 Tree - Shaking 技术详解 Tree - Shaking 是一种在打包时移除未使用代码的优化技术,在 Vue 3 中,Tree - Shaking 发挥了重要作用,有效减少了打包后的代码体积,提高了应用的加载性能。以下是对 Vue 3 中 Tree - Shaking …...

VSCode历史版本的下载安装

VSCode历史版本的下载安装 文章目录 VSCode历史版本的下载安装VSCode安装下载历史版本地址查询VSCode历史版本的 commit id 安装参考资料 VSCode安装 Windows版本:Windows10VSCode版本:VScode1.65.0(64位User版本)本文编写时间&a…...

Websoft9分享:在数字化转型中选择开源软件可能遇到的难题

引言:中小企业数字化转型的必由之路 全球94.57%的企业已采用开源软件(数据来源:OpenLogic 2024报告),开源生态估值达8.8万亿美元。中小企业通过开源软件构建EPR系统、企业官网、数据分析平台等,可节省80%软件采购成本。…...

【无人机】无人机PX4飞控系统高级软件架构

目录 1、概述(图解) 一、数据存储层(Storage) 二、外部通信层(External Connectivity) 三、核心通信枢纽(Message Bus) 四、硬件驱动层(Drivers) 五、飞…...

新版本Xmind结合DeepSeek快速生成美丽的思维导图

前言 我的上一篇博客(https://quickrubber.blog.csdn.net/article/details/146518898)中讲到采用Python编程可以实现和Xmind的互动,并让DeepSeek来生成相应的代码从而实现对内容的任意修改。但是,那篇博客中提到的Xmind有版本的限…...

Windows查重工具,强烈推荐大家收藏!

我大家在用电脑的时候,是不是发现用得越久,电脑里的软件和文件就越多? 今天我给大家带来的这两款重复文件查找神器,简直就是电脑里的“清洁小能手”,能帮你把那些重复的文件和文件夹找出来。 Easy DupLicate Finder 重…...

数字孪生技术之争:UE、Unity还是飞渡DTS数字孪生平台?

作为深耕数字孪生内容创作的B站UP主,我们创作的内容广受数十万粉丝喜爱。后台私信经常提及两个问题:“这质感绝了!如此丝滑流畅是UE做的吗?”VS “请问用Unity能实现这个效果吗?” Unreal Engine凭借影视级渲染&#…...

【GCC警告报错4】warning: format not a string literal and no format arguments

文章主本文根据笔者个人工作/学习经验整理而成,如有错误请留言。 文章为付费内容,已加入原创保护,禁止私自转载。 文章发布于:《C语言编译报错&警告合集》 如图所示: 原因: snprintf的函数原型&#x…...

【Tauri2】013——前端Window Event与创建Window

前言 【Tauri2】012——on_window_event函数-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146909801?spm1001.2014.3001.5501 前面介绍了on_window_event,这个在Builder中的方法,里面有许多事件,比如Moved,Res…...

修复SSL证书链不完整问题certificate verify failed unable to get local issuer certificate

文章目录 前言排查过程怀疑文章平台图片转存问题尝试使用 Python 代码下载图片使用 SSL Labs Server Test 验证猜想回顾 SSL 安装命令ACME 生成的证书 验证使用 [SSL Labs Server Test](https://www.ssllabs.com/ssltest/index.html) 验证文章发布平台转存验证 个人简介 前言 …...

管家婆财贸ERP BB102.采购销售订金管理

低适用版本: 财贸系列 23.8 插件简要功能说明: 采购订单/销售订单支持查询订金付款情况,联查下游付款/收款信息更多细节描述见下方详细文档 插件操作视频: 进销存类定制插件--采购销售订金管理 插件详细功能文档: …...

前端对接下载文件接口、对接dart app

嵌套在dart app里面的前端项目 1.前端调下载接口 ->后端返回 application/pdf格式的文件 ->前端将pdf处理为blob ->blob转base64 ->调用dart app的 sdk saveFile ->保存成功 async download() {try {// 调用封装的 downloadEContract 方法获取 Blob 数据const …...

牛客 简写单词

简写单词_牛客题霸_牛客网 主要是如何输入 #include <iostream> #include <string>using namespace std;int main() {string str;while(cin>>str){if(str[0]>a&&str[0]<z){cout<<char(str[0]-32);}else cout<<str[0];str.clear(…...

解决STM32CubeMX中文注释乱码

本人采用【修改系统环境变量】的方法 1. 使用快捷键 win X&#xff0c;打开【系统R】&#xff0c;点击【高级系统设置】 2. 点击【环境变量】 3. 点击【新建】 4.按图中输入【JAVA_TOOL_OPTIONS】和【-Dfile.encodingUTF-8】&#xff0c;新建环境变量后重启CubeMX即可。 解释…...

若依——基于AI+若依框架的实战项目(实战篇(下))

目录 前言​ 6. 设备管理 6.1 需求说明 6.2 生成基础代码 6.2.1 需求 6.2.2 步骤 ①创建目录菜单 ②添加数据字典 ③配置代码生成信息 ④下载代码并导入项目 6.3 设备类型改造 6.3.1 基础页面 需求 代码实现 6.4 设备管理改造 6.4.1 基础页面 需求 代码实现 …...

SpringBoot项目瘦身指南:从臃肿到高效的优化实践

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、问题背景 SpringBoot的"约定优于配置"特性极大提升了开发效率&#xff0c;但默认配置可能导致项目逐渐臃肿。典型的症状包括&#xff1a; 打…...

运筹帷幄:制胜软件开发

运筹学在软件开发项目中的作用主要体现在复杂系统建模、资源优化和决策支持中。通过数学建模、算法设计和数据分析&#xff0c;运筹学能够帮助开发团队更高效地实现软件需求&#xff0c;尤其是在涉及资源分配、路径规划、调度优化等场景时。 案例&#xff1a;电商物流配送系统的…...

代码随想录|动态规划|18完全背包理论基础

leetcode:52. 携带研究材料&#xff08;第七期模拟笔试&#xff09; 题目 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些…...

52.个人健康管理系统小程序(基于springbootvue)

目录 1.系统的受众说明 2.开发环境与技术 2.1 MYSQL数据库 2.2 Java语言 2.3 微信小程序技术 2.4 SpringBoot框架 2.5 B/S架构 2.6 Tomcat 介绍 2.7 HTML简介 2.8 MyEclipse开发工具 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作…...

大语言模型中的嵌入模型

本教程将拆解什么是嵌入模型、为什么它们在NLP中如此重要,并提供一个简单的Python实战示例。 分词器将原始文本转换为token和ID,而嵌入模型则将这些ID映射为密集向量表示。二者合力为LLMs的语义理解提供动力。图片来源:[https://tzamtzis.gr/2024/coding/tokenization-by-an…...

运维之 Centos7 防火墙(CentOS 7 Firewall for Operations and Maintenance)

运维之 Centos7 防火墙 1.介绍 Linux CentOS 7 防火墙/端口设置&#xff1a; 基础概念&#xff1a; 防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量&#xff0c;以保护计算机系统免受未经授权的访问和恶意攻击。Linux CentOS 7操作系统自带了一个名为iptables的…...

Ubuntu 20.04 出现问号图标且无法联网 修复

在 Ubuntu 中遇到网络连接问题&#xff08;如出现问号图标且无法联网&#xff09;&#xff0c;可以通过以下命令尝试重启网络服务&#xff1a; 1. 推荐先修改DNS 编辑 -> 虚拟机网络编辑器-> VMnet8 ->NAT 设置 -> DNS 设置 -> 设置DNS 服务器 DNS填什么 取决…...

联想M7400打印机怎么清零

一&#xff08;粉盒加粉后清零&#xff09;&#xff1a; 开机&#xff0c;打开前盖&#xff1b; 按下 “清除返回” 键&#xff0c;屏幕显示 “更换硒鼓&#xff1f;是否”&#xff1b; 按 “开始” 键&#xff0c;屏幕无显示&#xff1b; 按下 “” 号键 11 次&#xff0c…...

AIGC7——AIGC驱动的视听内容定制化革命:从Sora到商业化落地

引言&#xff1a;个性化视听时代的到来 2024年&#xff0c;OpenAI发布视频生成模型Sora&#xff0c;可生成60秒高清视频&#xff1b;中国团队推出的Vidu模型实现16秒镜头连贯生成。这些突破标志着AIGC正式进入高质量视听内容定制化阶段。据Gartner预测&#xff0c;到2027年&am…...

Git Restore 命令详解与实用示例

文章目录 Git Restore 命令详解与实用示例1. 恢复工作区文件到最后一次提交的状态基本命令示例恢复所有更改 2. 恢复某个文件到特定提交的状态基本命令示例 3. 恢复暂存区的文件基本命令示例恢复所有暂存的文件 git restore 的常见选项git restore 与 git checkout 比较总结 Gi…...

Sentinel全面解析与实战教程

Sentinel全面解析与实战教程 一、引言 在现代分布式系统中&#xff0c;随着业务的不断发展和流量的日益增长&#xff0c;保障系统的稳定性成为了重中之重。Sentinel作为一款优秀的高可用流量防护组件&#xff0c;为解决系统中的流量控制、熔断降级等问题提供了有效方案。本文…...

考研总结(初试篇)--双非勇闯985

考研终于告一段落了&#xff0c;也是被湖南大学拟录取了&#xff0c;写下这篇总结&#xff0c;回顾一下我的经历吧。 我是2024年3月开学的时候&#xff0c;正式确定考研的。当时纠结于定学校&#xff0c;长理和湖大。最后还是选择湖大&#xff0c;因为反正都是要好好准备的&am…...

【电路笔记】-触发器的转换

触发器的转换 文章目录 触发器的转换1、概述2、置位-复位SR触发器3、门控置位-复位(SR)触发器4、数据(D型)触发器5、JK触发器6、使用主从触发器的触发器转换7、(切换)T型触发器8、总结触发器是时序电路的基本构建模块,可以从一种形式转换到另一种形式,能够存储单个数据…...

QT 中的元对象系统(五):QMetaObject::invokeMethod的使用和实现原理

目录 1.简介 2.原理概述 3.实现分析 3.1.通过方法名调用方法的实现分析 3.2.通过可调用对象调用方法的实现分析 4.使用场景 5.总结 1.简介 QMetaObject::invokeMethod 是 Qt 框架中的一个静态方法&#xff0c;用于在运行时调用对象的成员函数。这个方法提供了一种动态调…...

基数排序算法解析与TypeScript实现

基数排序&#xff08;Radix Sort&#xff09;是一种高效的非比较型整数排序算法&#xff0c;通过逐位分配与收集的方式实现排序。本文将深入解析其工作原理&#xff0c;并给出完整的TypeScript实现。 一、算法原理 1. 核心思想 多关键字排序&#xff1a;将整数按位数切割成不同…...

oracle asm 相关命令和查询视图

有关asm磁盘的命令 添加磁盘 alter diskgroup data1 add disk /devices/diska*;---runs with a rebalance power of 5 , and dose not return until the rebalance operation is completealter diskgroup data1 add disk /devices/diskd* rebalance power 5 wait;查询 select …...

THUNLP_Multimodal_Excercise

背景 多模态大模型&#xff08;Multimodal Large Language Models, MLLM&#xff09;的构建过程中&#xff0c;模型结构、模型预测、指令微调以及偏好对齐训练是其中重要的组成部分。本次任务中&#xff0c;将提供一个不完整的多模态大模型结构及微调代码&#xff0c;请根据要求…...