参考上一篇lua协程的介绍,协程中resume和yield协做那幅图一直没彻底理解,理解了好几遍,结合示例才搞明白了一点。
最后总结一下自己的理解:
1、首次调用resume函数,参数直接传递给协程函数;
2、yield函数传递的参数是resume函数的返回值的一部分,resume返回值还包括操作结果bool变量;即yield函数参数+(true/false) = resume函数的返回值;
3、resume函数的参数等价与yield的返回值;
上一篇代码详细介绍:
a、例子1:简单实用resume、yield,如下:
coco = coroutine.create(function (a,b)
print("resume args:"..a..","..b)
yreturn = coroutine.yield()
print ("yreturn :"..yreturn)
end)
coroutine.resume(coco,0,1) --首次调y用0和1直接传递给协程函数,即a=1,b=1
coroutine.resume(coco,21) --resume的参数就是yield函数的返回值,即yreturn=21
输出结果如下:
resume args:0,1
yreturn :21
b、复杂例子
function status()
print("co1's status :"..coroutine.status(co1).." ,co2's status: "..coroutine.status(co2))
end
co1 = coroutine.create(function ( a )
print("arg is :"..a)
status()
local stat,rere = coroutine.resume(co2,"2")
print("resume's return is "..rere)
status()
local stat2,rere2 = coroutine.resume(co2,"4")
print("resume's return is "..rere2)
local arg = coroutine.yield("6")
end)
co2 = coroutine.create(function ( a )
print("arg is :"..a)
status()
local rey = coroutine.yield("3")
print("yeild's return is " .. rey)
status()
coroutine.yield("5")
end)
--主线程执行co1,传入字符串“main thread arg”
stat,mainre = coroutine.resume(co1,"1")
status()
print("last return is "..mainre)
arg is :1
co1's status :running ,co2's status: suspended
arg is :2
co1's status :normal ,co2's status: running
resume's return is 3
co1's status :running ,co2's status: suspended
yeild's return is 4
co1's status :normal ,co2's status: running
resume's return is 5
co1's status :suspended ,co2's status: suspended
last return is 6
c、最后附一个云风在Lua5.3参考手册中给出的例子
function foo(a)
print("foo", a)
return coroutine.yield(2 * a)
end
co = coroutine.create(function ( a, b )
print("co-body", a, b)
local r = foo(a + 1)
print("co-body", r)
local r, s = coroutine.yield(a + b, a - b)
print("co-body", r, s)
return b, "end"
end)
print("main", coroutine.resume(co, 1, 10))
print("main", coroutine.resume(co, "r"))
print("main", coroutine.resume(co, "x", "y"))
print("main", coroutine.resume(co, "x", "y"))
co-body 1 10
foo 2
main true 4
co-body r
main true 11 -9
co-body x y
main true 10 end
main false cannot resume dead coroutine
上面写了这么多,一直都不知道为什么要搞清楚协程,在另外一篇文章里面看到,其强大之处在于实现主程和协程之间的数据交互。resume函数向协程传递数据,数据以yield返回值展示;yield函数向主程返回协程内状态数据,数据以resume返回值展示。