您好,登錄后才能下訂單哦!
-- coroutine api: create, resume, yield, wrap. running, status
-- coroutine status: suspend, running, normal, dead
local stop = function()
return coroutine.yield(7, 9)
end
local co = coroutine.create(
function(a, b)
print("co-body 1: ", a, b)
local m1, m2 = coroutine.yield(1, 3, 5)
print("co-body 2: ", m1, m2)
stop()
return "haha"
end
)
print("type of coroutine: ", type(co))
print("status of coroutine after creating: ", coroutine.status(co))
print("main-body 1: ", coroutine.resume(co, 11, 13))
print("main-body 2: ", coroutine.resume(co, 15, 16))
print("main-body 3: ", coroutine.resume(co, 17))
print("status of coroutine after running: ", coroutine.status(co))
print("main-body 4: ", coroutine.resume(co))
---------------------執行結果-------------------
type of coroutine: thread
status of coroutine after creating: suspended
co-body 1: 11 13
main-body 1: true 1 3 5
co-body 2: 15 16
main-body 2: true 7 9
main-body 3: true haha
status of coroutine after running: dead
main-body 4: false cannot resume dead coroutine
--------------------------------------------------------
coroutine.create(function(args) ... end):創建一個協程,不運行。通過type可以看到協程本質上是一個線程。創建后,處于掛起狀態。
resume運行一個協程,yield掛起一個協程。 resume和yield是協作運行,是協程的精髓。resume將參數傳遞給yield,作為yield返回值。 yield的參數,作為resume的返回值。當resume首次運行的時候,其參數是作為create里面函數的參數進行傳遞的。
resume是作為保護模式運行的,即當協程內發生錯誤的時候,程序不會abort,而是會返回false和錯誤信息。eg:resume一個已經掛掉的協程,其返回值信息見main-body 4。
wrap和resume不同的是,wrap在執行的時候,返回格式不是bool+返回值,而直接是返回值。當發生錯誤的時候,直接assert。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。