一 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, " ")
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唤醒