1.create
创建协同程序 ,参数是函数(一般都是匿名函数),返回值是thread类型
co = coroutine.create(function ()
print("hi")
end)
print(co) --> thread: 0x8071d98
2.status
print(coroutine.status(co)) --> suspended
status 协同有三个状态:挂起态(suspended)、运行态(running)、停止态(dead)。刚创建时是挂起态
3.resume
函数coroutine.resume使协同程序由挂起状态变为运行态:
coroutine.resume(co) --> hi
运行介绍后状态变成dead
4.yield
它可以将正在运行的代码挂起,看一个例子:
co = coroutine.create(function ()
for i=1,10do
print("co", i)
coroutine.yield()
end
end)
5.Lua中协同的强大能力,还在于通过resume-yield来交换数据。
<1>只有resume,没有yield,resume把参数传递给协同的主程序。
co = coroutine.create(function (a,b,c)
print("co", a,b,c)
end)
coroutine.resume(co, 1, 2, 3) --> co 1 2 3
<2>,数据由yield传给resume。true表明调用成功,true之后的部分,即是yield的参数。
-->yield的参数resume的返回值
co = coroutine.create(function (a,b)
coroutine.yield(a + b, a - b)
end)
print(coroutine.resume(co, 20, 10)) --> true 30 10
相应地,resume的参数,会被传递给yield。
-->resume的参数变成yield的返回值
co = coroutine.create (function ()
print("co", coroutine.yield())
end)
coroutine.resume(co)
coroutine.resume(co, 4, 5) --> co 4 5
<3>协同代码结束时的返回值,也会传给resume:
co = coroutine.create(function ()
return 6, 7
end)
print(coroutine.resume(co)) --> true 6 7