感觉programing in lua书中这块讲的不太清楚,自己理解了半天,因此写出来
-
local co = coroutine.create(function (...)
-
print("arg: ", ...)
-
print("yield return: ", coroutine.yield(100, ...))
-
return "coroutine end"
-
end)
-
print("resume 1: ", coroutine.resume(co, 1, 2, 3))
-
print("resume 2: ", coroutine.resume(co, 4, 5, 6))
如上代码,
第一次调用resume的时候程序没有yield在等,因此resume除co以外的参数都传递给协同主程序,因此执行打印:arg: 1 2 3
然后执行到yield后程序suspended, 并且yield通过自己的参数和resume它的程序交换数据,所以第一次调用的resume返回了yield的参数,所以打印出:
resume 1: 100 1 2 3
第二次调用resume的时候程序有yield在等,因此resume(co, 4, 5, 6)除co以外的参数都传递给这个yield,因此yield返回了resume的这些参数,程序打印:
yield return: 4 5 6, 最后执行return 语句,结束整个协同程序,最中结果返回resume调用,因此打印:resume 2: coroutine end
这样,lua就通过一对resume和yield实现了协同程序的数据交换
上面事例代码结果为:
-
lua $ lua coroutine6.lua
-
arg: 1 2 3
-
resume 1: true 100 1 2 3
-
yield return: 4 5 6
-
resume 2: true coroutine end
注:resume以保护模式运行,返回ture和运行结果或false和错误信息
阅读(5267) | 评论(0) | 转发(0) |