協(xié)程

lua將所有關(guān)于協(xié)同程序的函數(shù)放置在一個名為“coroutine”的table中。

create  ///創(chuàng)建新的協(xié)同程序

例:

co = coroutine.create(function () print("hi")  end)

print(co)  --> thread: 0x8071d98

一個協(xié)程可以處于4種不同的狀態(tài):掛起(suspended)、運行(running)、死亡(dead)、正常(normal)。創(chuàng)建一個協(xié)程時,它處于掛起狀態(tài)。也就是說協(xié)程在被創(chuàng)建時不會自動執(zhí)行其內(nèi)容。可以通過status來檢查協(xié)程狀態(tài):

print(coroutine.status(co))  -->suspended

resume用于啟動或再啟動一個協(xié)程的執(zhí)行,并將其狀態(tài)由掛起改為運行:

coroutine.resume(co)   -->hi

由于創(chuàng)建的協(xié)程只是簡單的print,上面語句結(jié)束后就處于死亡狀態(tài),無法返回了

print(coroutine(co))  -->dead

yield:可以讓一個運行中的協(xié)程掛起,再之后可以恢復(fù)它的運行。

co = coroutine.create(function ()
            for i=1, 10 do
              print("co",i)
              coroutine.yield()
            end
        end)

現(xiàn)在喚醒它時,它將執(zhí)行到第一個yield:

coroutine.resume(co)  -->co 1

此時檢查其狀態(tài),可以發(fā)現(xiàn)協(xié)程處于掛起狀態(tài),因此可以再次恢復(fù)運行:

print(coroutine.status(co))  -->suspended

只有恢復(fù)了協(xié)程的執(zhí)行時,yield調(diào)用才最終返回,然后協(xié)程繼續(xù)執(zhí)行,直到下一個yield或執(zhí)行結(jié)束:

coroutine.resume(co)  -->co 2
coroutine.resume(co)  -->co 3
...

最后一次調(diào)用協(xié)程時,協(xié)程內(nèi)容已經(jīng)執(zhí)行完畢并已返回,如果再嘗試恢復(fù)它的執(zhí)行,resume將返回false及一條錯誤信息。

協(xié)程A喚醒另一個協(xié)程B時,A的狀態(tài)既不是掛起,也不是結(jié)束,稱為正常狀態(tài)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容