lua将所有关于协同程序的函数放置在一个名为“coroutine”的table中。
create ///创建新的协同程序
例:
co = coroutine.create(function () print("hi") end)
print(co) --> thread: 0x8071d98
一个协程可以处于4种不同的状态:挂起(suspended)、运行(running)、死亡(dead)、正常(normal)。创建一个协程时,它处于挂起状态。也就是说协程在被创建时不会自动执行其内容。可以通过status来检查协程状态:
print(coroutine.status(co)) -->suspended
resume用于启动或再启动一个协程的执行,并将其状态由挂起改为运行:
coroutine.resume(co) -->hi
由于创建的协程只是简单的print,上面语句结束后就处于死亡状态,无法返回了
print(coroutine(co)) -->dead
yield:可以让一个运行中的协程挂起,再之后可以恢复它的运行。
co = coroutine.create(function ()
for i=1, 10 do
print("co",i)
coroutine.yield()
end
end)
现在唤醒它时,它将执行到第一个yield:
coroutine.resume(co) -->co 1
此时检查其状态,可以发现协程处于挂起状态,因此可以再次恢复运行:
print(coroutine.status(co)) -->suspended
只有恢复了协程的执行时,yield调用才最终返回,然后协程继续执行,直到下一个yield或执行结束:
coroutine.resume(co) -->co 2
coroutine.resume(co) -->co 3
...
最后一次调用协程时,协程内容已经执行完毕并已返回,如果再尝试恢复它的执行,resume将返回false及一条错误信息。
协程A唤醒另一个协程B时,A的状态既不是挂起,也不是结束,称为正常状态。