主要说明coroutine的 resume 和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)
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("---分割线---")
上述代码来自于 runoob/lua。
具体的解释以下图为主。
Lua的协同程序是在挂起---唤醒--挂起----唤醒---.......-----end(dead)中切换的,切换的过程中yield接收consume的参数,并返回yield后的值,就像上面看到的
conortibue.yield(a+b,a-b) 第一次是 11,-9 而当传递 consume(co,"x","y") 后 yield后就变成了 x,y 是在变化的。
以上是一点小总结, 参考无妨,理解需要自己动手,估计有不恰当的地方,谨慎选择!!!!
还有下面的一个问题:
print("main", coroutine.resume(co, 1, 10)) -- true, 4
print("--分割线----")
print("main", coroutine.resume(co, "jack")) -- true 11 -9
print("---分割线---")
print("main", coroutine.resume(co, "jack", "niu")) -- true 10 end
print("---分割线---")
print("main", coroutine.resume(co, 1)) -- cannot resume dead coroutine
--coroutine.resume(co,1,2)
coroutine.resume(co)
print("main", coroutine.resume(co, 1, 10)) -- true, 4
print("--分割线----")
print("main", coroutine.resume(co, "jack")) -- true 11 -9
print("---分割线---")
print("main", coroutine.resume(co, "jack", "niu")) -- true 10 end
print("---分割线---")
print("main", coroutine.resume(co, 1)) -- cannot resume dead coroutine
输出
第一次协同程序执行输出 1 10
foo 函数输出 2
main true 4
--分割线----
第二次协同程序执行输出 jack
main true 11 -9 1
---分割线---
第三次协同程序执行输出 jack niu nil
main true 10 结束协同程序
---分割线---
main false cannot resume dead coroutine
main false cannot resume dead coroutine
--分割线----
main false cannot resume dead coroutine
---分割线---
main false cannot resume dead coroutine
---分割线---
main false cannot resume dead coroutine
当这个协同程序end 即dead之后,难道再不能重新唤起(就像最开始运行一次吗???),必须得重新构造一个 coroutine 吗??? 很无解。