Lua 协同程序coroutine 数据交换说明

   主要说明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 吗???  很无解。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值