惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Vercel News
Vercel News
人人都是产品经理
人人都是产品经理
G
Google Developers Blog
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
雷峰网
雷峰网
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
博客园 - 叶小钗
D
DataBreaches.Net
D
Docker
月光博客
月光博客
博客园 - 司徒正美
Last Week in AI
Last Week in AI
有赞技术团队
有赞技术团队
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
Lua--协同线程与文件IO
NE_STOP · 2026-05-13 · via 博客园_首页

协同线程与协同函数

协同线程

Lua中有一种特殊的线程,称为coroutine,协同线程,简称协程。

其可以在运行时暂停执行,然后转去执行其他线程,然后可以返回再继续执行没完成的内容。即可以“走走停停,停停走走”。

任意时刻只会有一个协程执行,不会出现多个协程同时执行的情况。

协同线程的类型为thread,其启动、暂停、重启等,通过函数来控制,具体方法如下:

无标题

-- 创建一个协同线程实例
co = coroutine.create(function(a,b)
    print(a,b,a+b)
    -- 获取正在运行的协同线程实例
    local co = coroutine.running()
    -- 输出协同线程实例的状态
    print(coroutine.status(co))
    -- 将当前协同线程挂起
    coroutine.yield()
    print("协同线程恢复了")
end)

-- 启动协同线程
coroutine.resume(co,1,2)
-- 输出协同线程的状态
print("主线程查看协同线程状态:"..coroutine.status(co))
-- 恢复协同线程的运行,不传后面的参数了,因为协同线程已经挂起了
coroutine.resume(co)
-- 输出协同线程的状态
print("主线程查看协同线程状态:"..coroutine.status(co))

运行结果如下:

无2标题

协同函数

协同线程可以单独创建执行,也可以通过协同函数调用启动执行。

使用coroutine的wrap()函数创建的就是协同函数,类型为function。

协同函数的调用会启动其内置的协同线程。

-- 创建一个协同函数
co = coroutine.wrap(function(a,b)
    print(a,b,a+b)
    local co = coroutine.running()
    print(coroutine.status(co))
    coroutine.yield()
    print("协同线程恢复了")
    print(a,b,a+b)
end)

-- 调用协同函数,启动协同线程    
co(1,2)

co()

运行结果如下

无标3题

文件IO

文件IO的函数分为两类:静态函数与实例 函数。

静态函数:通过io.xxx()方式对文件进行操作。

实例函数:通过面向对象的方式操作。

常用静态函数

  • io.open() 以指定模式打开文件,返回文件对象。

    格式:io.open(filename,mode)

    模式mod有三种:

    • r:只读,默认模式
    • w:只写,会覆盖原内容
    • a:只写,追加写入
    • +:增加符,在r+ ,w+,a+均变为了读写
    • b:二进制符,如果文件为二进制文件。则需要变为rb、wb、ab
  • io.input() 指定要读取的文件

    格式:io.input(file)

  • io.output() 指定要写入的文件

    格式:io.output(file)

  • io.read() 以指定格式读取io.input(file)中的内容。

    格式:io.read(format)

    format 的格式有:

    • *l:从当前位置的下一个位置读取整行,默认格式
    • *n:读取下一个数字
    • *a:从当前位置的下一个位置读取整个文件
    • number:这是一个数字,表示要读取的的字符的个数
  • io.write(data) 将数据data写入到io.output()中指定的文件

-- 以只读方法打开一个文件
local file = io.open("test.txt","r")
io.input(file)
-- 读取文件内容并输出
local content = io.read("*a")
print(content)
-- 关闭文件
file:close()-- 以只读方法打开一个文件
local file = io.open("test.txt","r")
io.input(file)
-- 读取文件内容并输出
local content = io.read("*a")
print(content)
-- 关闭文件
file:close()


-- 以追加方法打开一个文件
local file = io.open("test.txt","a")
io.output(file)
-- 向文件中写入内容
io.write("这是追加的内容\n")
-- 关闭文件
file:close()

常用实例函数

  • file:read() :这里的file是io.open() 返回的file,用法与io.read()相同

  • file:write():与io.write()相同

  • file:seek():获取或设置文件读写指针的位置。位置从1开始,除文件最后一行外,每行都有行结束符,其占两个字符位置。

    位置0 表示文件第一个位置。

    格式:file:seek(whence,offset)

    当seek()无参时,返回读写指针的位置。

    参数whence有三种,表示将指针定位到不同位置。

    参数offset 表示相对于whence 位置的偏移量,offset默认0,为正表示向后偏移,为负表示向前偏移。

​ whence的三种值:

	1. set:将指针定位到文件开头处,即0位置处
	2. cur:指针保持当前位置不变,默认
	3. end:将指针定位到文件结尾处
-- 以只读方法打开一个文件
 file = io.open("test.txt","r")

-- 读取文件内容并输出
local content = file:read("*a")
print(content)
-- 关闭文件
file:close()

-- 以追加方法打开一个文件
 file = io.open("test.txt","a")
-- 向文件中写入内容
file:write("这是追加的内容\n")
-- 关闭文件
file:close()

file = io.open("test.txt","r")
pos= file:seek()
print("当前文件指针位置:"..pos)
-- 将文件指针移动到文件开头
file:seek("set",0)
pos= file:seek()
print("当前文件指针位置:"..pos)
-- 将文件指针移动到文件末尾
file:seek("end",0)
pos= file:seek()
print("当前文件指针位置:"..pos)
file:close()