LUA协程

一  LUA 协程函数

1 resume

local  status, returnvs = coroutine.resume(co, params)

co 为 所要启动的协程。

第一次调用resume时,参数是协程函数入口的参数,协程函数调用coroutine.yield之后交出控制权

后面继续调用resume恢复该协程时, 参数是作为上次调用coroutine.yield处的返回值

status表明此次调用co是否有运行,co的状态。

若resume返回时co未结束,returnvs为coroutine.yield传递的参数。

如果返回时co已经结束,returnvs为co的return的返回值

 

2 yield

co(params)

    local ins = coroutine.yield(returnvs)

end

 

returnvs 作为本次调用co的 coroutine.resume的返回值。

ins为下次coroutine.resume重新调用co时输入的参数params。

 

二 例子

function consumer(arg)

         local v = 0

         print("consumer arg ", arg) //第一次调用coroutine.resume后开始执行consumer,参数通过coroutine.resume传入

         while true

         do

                   recv = coroutine.yield(v*2) //第一次执行到这句开始暂停,等待再次调用coroutine.resume,再次调用coroutine.resume后,recv值就是

//coroutine.resume传入的参数,yield的参数就是给coroutine.resume返回的值

                   if recv == 0

                   then

                            break

                   end

                   v = recv

                   print("consumer, recv-> ", recv)

         end

end

 

 

function produce()

         co = coroutine.create(consumer)

         local  status, returnvs = coroutine.resume(co, "hello func agr")

         i = 1

         repeat

                   status, returnvs = coroutine.resume(co, i)

                   print("produce, ret-> ", returnvs, "\n")

                   i = i + 1

         until( i > 10 )

         status, returnvs = coroutine.resume(co, 0)

         print(status, returnvs)

end

 

 

produce()

 

三 总结

1 yield的参数就是resume的返回值,resume的参数就是yield的返回值,参数可以是多个参数

2 第一次调用resume时的参数是协程函数入口的参数

3 第一次碰到yield语句之后协程停止执行,直到调用resume唤醒

posted @ 2017-05-26 18:53  sysnap  阅读(441)  评论(0编辑  收藏  举报