lua协程

        参考上一篇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返回值展示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值