lua 将所有的协同程序放在一个名为coroutine 的table 中。通过creat 创建协同程序,它只有一个参数就是函数。函数的代码则是协同程序要执行的内容。
co = coroutine.create(function (a,b,c)
print("co",a,b,c) end)
coroutine.resume(co,1,2,3)
输出结果:co 1 2 3
一个协同程序可以处于四种不同状态,挂起(suspend)运行(running)死亡(dead)正常(normal)。当创建一个协同程序事它处于挂起。
print(coroutine.status(co)) ------suspended
coroutine.resume 用于再次启动协同程序。
通过yield 使协同程序挂起。
co = coroutine.create(function ( )
for i = 1,10 do
print("co",i)
coroutine.yield()
end
-- body
end)
此时使用coroutine.resume(co)唤醒时,程序会执行到yield处挂起。
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
输出结果:
co 1
co 2
co 3
co 4
co 5
co 6
co 7
co 8
co 9
co 10
再次唤醒,什么都不打印,协同程序已处于死亡状态
resume 对yield 传入参数。
co = coroutine.create(function (a,b)
coroutine.yield(co,a+b,b-a)
end)
print(coroutine.resume(co,20,10))
输出结果:true thread: 0x7f9cd2c0a410 30 -10
第一个true表示没有错误。后续是参数传入yield的结果。
算法:输出表中所有组合方式的代码,可改为协同程序:
function printResult( a)
for i=1,#a do
io.write(a[i]," ")
end
io.write("\n")
-- body
end
function permgen( a,n )
n = n or #a
if n<=1 then
printResult(a)
else
for i=1,n do
a[n], a[i] = a[i],a[n]
permgen(a,n-1)
a[n], a[i] = a[i],a[n]
end
end
-- body
end
permgen({1,2,3,4},4)