寫點簡單的控制線程掛起的操作,coroutine.yield()這個函數的使用,從協同的觀點看:使用函數yield可以使程序掛起,當我們激活被掛起的程序時,將從函數yield的位置繼續執行程序,直到再次遇到yield或程序結束。首先我們先看一段代碼,如下:
co = coroutine.create(function ()
for i=1,10 do
print("co",i)
coroutine.yield()
end
end)
coroutine.resume(co)
print(coroutine.status(co))
這段代碼比較簡單,高手就不用來這裡,呵呵,偶也是一個初學者,大家新手入門的話可以關注本博客,隨時查看一下這些內容,coroutine.yield()其中這句話負責將正在運行的東西掛起,我們打印出它的狀態可以看到如下結果,如圖:
然後我們再繼續添加一些代碼,代碼如下:
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
print(coroutine.resume(co))
我們把已經結束的線程再繼續的時候就出現以下情況,上面的代碼只是為了展示給大家會出現什麼結果,結果如下圖:
我們可以看到最後打印出一個 :cannot resume dead coroutine(不能繼續運行一個已經死亡的線程)。
注意:resume運行在保護模式下,因此,如果協同程序內部存在錯誤,Lua並不會拋出錯誤,而是將錯誤返回給resume函數。