1. 程式人生 > >LUA協程

LUA協程

返回 語句 sta cal resume res 停止 執行 ==

一 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協程