Lua编程示例(七):协同程序基础逻辑
Lua协同程序通过create()创建、resume()唤醒、yield()暂停实现手动控制函数执行,状态包括suspended(挂起)和dead(死亡),支持参数传递及yield与resume间的数据交换,常用于迭代器、状态机或异步流程控制,实现非抢占式并发,是轻量级线程,可进行多任务协作。
在Lua的世界里,协同程序(coroutine)一直是个让不少开发者既兴奋又头疼的话题。简单说,它允许你手动控制函数的执行与暂停,就像给函数装了一个“暂停/继续”按钮。下面这段代码,把协同程序从创建到销毁的核心逻辑都走了一遍,我们逐段看看。
基础状态切换
co=coroutine.create(function()
print("hi")
end)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
print()
创建一个协同程序后,它的状态是suspended(暂停)。用resume唤醒它,打印“hi”后函数执行完毕,状态变成dead(死亡)。这就好比一个一次性任务——跑完就没了。
yield 的暂停与恢复
co=coroutine.create(function()
for i=1,2 do
print("co",i)
coroutine.yield()
end
end)
coroutine.resume(co)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
coroutine.resume(co) --没有输出
print(coroutine.status(co))
print()
这里的关键是yield。第一次resume后,循环打印“co 1”,然后遇到yield立即挂起,状态变为suspended。第二次resume,从上次中断点继续,打印“co 2”后再次yield。第三次resume时,循环已经结束,函数自然返回,状态变为dead,且没有任何输出。注意:第三次resume虽然成功执行,但函数体内已经没有代码可跑了。
参数传递
co=coroutine.create(function(a,b,c)
print("co",a,b,c)
end)
coroutine.resume(co,1,2,3)
resume传入的参数会直接传递给协同函数的参数列表。这里分别把1、2、3赋给a、b、c,打印结果一目了然。
yield 与 resume 之间的数据交换
co=coroutine.create(function(a,b)
print("I'm before yield") --第一次运行执行
coroutine.yield(a+b,a-b,"needless args") --在这停住,返回yield的参数
print("Mgs")
end)
print(coroutine.resume(co,20,10)) --参数传给yield,处理后再返回
print("I print first")
coroutine.resume(co)
这里展示了协同程序最灵活的特性:yield可以把值返回给resume,而resume的返回值中第一个是布尔值(表示是否成功),后面跟着yield传入的参数。第一次resume(co,20,10),函数先打印“I'm before yield”,然后yield(30,10,"needless args")——此时resume收到三个额外返回值。注意主程序中的“I print first”是在第二次resume之前打印的,说明协同程序被挂起后,主程序继续执行,直到再次resume才唤醒它打印“Mgs”。
函数返回值的传递
co=coroutine.create(function() return "I'll return" end) print(coroutine.resume(co)) --主函数的返回值回传给resume
当协同函数正常返回时,它的返回值会作为resume的额外返回值传出。这里返回了字符串,所以输出为true I'll return。
完整的输出结果如下:

suspended hi dead co 1 suspended co 2 suspended dead co 1 2 3 I'm before yield true 30 10 needless args I print first Mgs true I'll return
把协同程序看作一个可以手动暂停的协程任务,理解起来会轻松很多。实际开发中,常用它来实现迭代器、状态机或异步流程控制——掌握这些基础操作,后面的路就好走了。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















