协同程序与操作系统中的线程类似,但工作方式是不同的,例如线程的时间片调度算法,当某个线程的时间片用完,系统会自动让该线程等待,让后面的线程运行。而对于协同程序,除非一个正在运行的协同程序被挂起,否则就一直运行到结束才能让其他协同程序运行。
举个例子:
function coroutineFun()
local co = coroutine.create(function(a, b)
for i = 1, 10 do
print(a + b)
coroutine.yield()
end
end)
return co
end
local co = coroutineFun()
for i = 1, 11 do
coroutine.resume(co, i, 6)
print(coroutine.status(co))
end
coroutine.create(函数) --创建一个协同程序
coroutine.yield() --将该协同程序挂起
coroutine.resume(co, i, 6) --运行协同程序,第一个参数是协同程序名称,后面的是协同程序里函数需要传入的参数
coroutine.status(协同程序名称) --获取协同程序的状态,并返回状态信息
输出结果:
可以看到运行协程时,只有第一次传入的参数起到了作用,后面传入的参数都不被理睬,这就像发射子弹一样,一旦枪口位置和方向决定了,一旦开枪,子弹的运行轨迹就决定了,不会再改变是一个到底,协程就会用来制作这样类似的游戏。
一旦协程被挂起,执行一次就不再执行了,需要不断地resume来继续协程的执行。可以看到,没执行完一次,协程的状态就是suspended(挂起状态),知道全部运行完毕,最后的状态就会变成dead(死亡状态)。
如果这里把协同中的挂起去掉:
function coroutineFun()
local co = coroutine.create(function(a, b)
for i = 1, 10 do
print(a + b)
--coroutine.yield()
end
end)
return co
end
local co = coroutineFun()
for i = 1, 11 do
coroutine.resume(co, i, 6)
print(coroutine.status(co))
end
像这样,输出结果:
可以看到协程就会一直运行到结束。