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喚醒
LUA協程