一、简介
Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。
协同是非常强大的功能,但是用起来也很复杂。
二、使用
1.创建:
--第一种创建方法
function fun1(a,b)
-- body
print(a+b)
end
co=coroutine.create(fun1)
--第二种创建方法 使用匿名函数
co=coroutine.create(function fun1( a,b )
-- body
print(a+b)
end)
2.调用
coroutine.resume(co,20,30) --控制台输出50
3.暂停
在想要暂停执行的地方加上coroutine.yield()
语句
function fun1(a,b)
-- body
print(a+b)
coroutine.yield()
print(a*b)
end
co=coroutine.create(fun1)
coroutine.resume(co,20,30)
print("我是暂停后执行的")
--执行结果为 :
50
我是暂停后执行的
4.继续
要想重新开始暂停的程序调用coroutine.resume(co)
即可,需要注意的是调用时不用传参数
function fun1(a,b)
-- body
print(a+b)
coroutine.yield()
print(a*b)
end
co=coroutine.create(fun1)
coroutine.resume(co,20,30)
print("我是暂停后执行的")
coroutine.resume(co)
执行结果为 :
50
我是暂停后执行的
600
三、注意
- 在携程执行完后不能复活,既不能调用resume函数
- 在第二次或者更多次调用resume时,除了第一个参数外,后面的参数会传递给暂停处的yield()函数
coroutine.yield()
函数能够向主线程传递参数
四、实例
function foo (a)
print("foo 函数输出", a)
return coroutine.yield(2 * a) -- 返回 2*a 的值
end
co = coroutine.create(function (a , b)
print("第一次协同程序执行输出", a, b) -- co-body 1 10
local r = foo(a + 1)
print("第二次协同程序执行输出", r)
local r, s = coroutine.yield(a + b, a - b) -- a,b的值为第一次调用协同程序时传入
print("第三次协同程序执行输出", r, s)
return b, "结束协同程序" -- b的值为第二次调用协同程序时传入
end)
--注意:在第二次或者后面resume时的参数除了第一个,其他会传入yield函数
print("main", coroutine.resume(co, 1, 10)) -- true, 4
print("--分割线----")
print("main", coroutine.resume(co, "r")) -- true 11 -9
print("---分割线---")
print("main", coroutine.resume(co, "x", "y")) -- true 10 end
print("---分割线---")
print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine
print("---分割线---")
执行结果:
参考
http://www.runoob.com/lua/lua-coroutine.html