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)。