一、简介

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("---分割线---")

执行结果:

undefined

参考

http://www.runoob.com/lua/lua-coroutine.html