编辑器是IDEA,lua协程学习汇总:
---lua协程
--可以使用debug模式一步步查看程序的运行
coroutineFunction = function(a,b)
--coroutine.yield 挂起正在运行的协程 传递给yield的参数将成为resume的额外返回值
for i = 1, 3 do
print(i,a,b)
local returnValue01,returnValue02 = coroutine.yield()
print(returnValue01,returnValue02)
end
end
--coroutine.create 根据一个函数创建协同程序
co2 = coroutine.create(coroutineFunction)
--coroutine.resume 开始或者继续一个协程的运行
--当第一次执行一个协程时,从主函数开始运行,参数传入函数主体
--如果协程被挂起,resume会重新启动它,参数作为挂起点的返回值
coroutine.resume(co2,100,200) --输出 1 100 200
coroutine.resume(co2,500,600) --输出 500 600 和 2 100 200
coroutine.resume(co2,700,800) --输出 700 800 和 3 100 200
testM01 = function(a,b)
print(coroutine.status(co1)) --输出running
print("co",a,b,coroutine.yield("king"))
return "bbb"
end
co1 = coroutine.create(testM01)
--coroutine.status 显示协程状态
--如果协程正常运行,那么resume返回true和传给yield的参数(当协程挂起)
--或者时主体函数的所有返回值(当协程终止)
print(coroutine.resume(co1,1,2)) --输出 true king
print(coroutine.status(co1)) --输出 suspended
print(coroutine.resume(co1,3,4,5)) --输出 co 1 2 3 4 5 true bbb
print(coroutine.status(co1)) --输出 dead
local co1 = coroutine.create(
function()
print("来看看协程出现错误怎么处理")
coroutine.yield(bb.name)
end)
--coroutine.resume是在保护模型下运行,如果有错误发生
--lua不会显示错误,而是返回false和错误消息
--同时这个协程的状态变成dead
print(coroutine.resume(co1))
print(coroutine.status(co1)) --输出dead
local co2 = coroutine.create(
function()
print(coroutine.running()) --输出thread: 0079C490
end)
coroutine.resume(co2)
--coroutine.running 返回当前正在运行的协程
print(coroutine.running()) -- 输出 nil
---coroutine.wrap 创建一个新协程
--返回一个函数,每次调用该函数都会延续该协程
--coroutine.wrap不是在保护模型下运行,如果发生错误,则抛出这个错误
local wrap = coroutine.wrap(
function(input)
print("函数的参数"..input)
local can1,can2 = coroutine.yield("bbb")
print(can1,can2)
return "函数返回值"
end)
print(wrap("abc")) --输出 函数的参数abc bbb
print(wrap("efg")) --输出 efg nil 函数的返回值