协同程序跟线程差不多,就是一个执行序列,拥有自己独立的栈,局部变量和指针
同时又与其它协同程序共享全局变量和其它大部分东西。跟线程的区别在于:
一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行;
一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显式地要求挂起时,它的执行才会暂停。
Lua中所有协同程序的函数放置在 “coroutine” 的 table 中
create创建一个协同程序,参数是一个函数,该函数的代码就是协同程序所需执行的内容。返回一个thread类型的值,用以表示新的协同程序
local a = coroutine.create( function() print(xx) end )
local b = coroutine.create( function() print(xx) end )
thread: 0000029F639905A8
thread: 0000029F63990688
四个状态:挂起(suspended),运行(running),死亡(dead),正常(normal)
创建之后是挂起状态,可通过 status 来检查状态
print(coroutine.status(a)) --suspended
print(coroutine.resume(b))
coroutine.resume 用于启动或再次启动一个协同程序,将其状态改为运行
一般协同程序的内容调用后就终止了,然后处于死亡状态,无法返回。
函数 yield 可以让一个运行中的协同程序挂起,而之后可以再恢复它的运行
local a =
coroutine.create(
function()
for i = 1, 10 do
print(i)
coroutine.yield()
end
end
)
coroutine.resume(a) -- 1
coroutine.resume(a) -- 2
coroutine.resume(a) -- 3
上述例子中,函数执行一次之后就被挂起,等待下一次恢复
最后一次调用 resume 时,resume 将返回 false 和一条错误信息
当一个协同程序 A 唤醒另一个协同程序 B 时,协同程序 A 就处于一个特殊状态,既不是挂起,也不是运行,称为正常(normal)