Lua中使用協程
阿新 • • 發佈:2018-11-15
前一段時間在寫遊戲裡的抽獎介面,會用到計時器,所以學了一點關於Lua中關於協程的用法,記錄下來給大家分享
首先我們要了解一下協程的生命週期,一個協程有四種狀態:掛起(suspended),執行(running),死亡(dead)和正常(normal)
我們先建立一個簡單的協程:
local co = coroutine.create(function() print("HelloWorld") end)
print(co)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
第一行程式碼我們建立一個一個包含函式的協程,第二行程式碼列印該協程,第三行程式碼列印協程狀態,第四行執行協程,第五行再次列印狀態,我們看一下輸出:
thread: 00A1D210
suspended
HelloWorld
dead
可以看出,直接列印協程可以得到一個執行緒的地址,也就是該協程的地址。然後協程創建出來時,預設是掛起狀態,使用resume可以執行該協程。然後在執行完協程函式以後,協程的狀態為死亡。
看到這裡,其實還完全沒有看出協程相對於普通函式的優勢,反而看起來更加繁瑣。那是因為我們沒有用到它的yield()函式,我們可以再看一個例項:
local co = coroutine.create(function() for i=1,10 do print("co",i) coroutine.yield(i) end end) coroutine.resume(co) print(coroutine.status(co))
在協程函式中,我們用for迴圈依次輸出了1到10 的值,其中用到了yield()函式。
我們看一下輸出:
co 1
suspended
迴圈在執行一次之後就被暫停了,我們繼續執行resume函式,可以依次得到輸出
co 2
co 3
co 4
......
co 10
注意,當執行完第十次以後,協程進入死亡,不能再resume,如若不然會報錯。
至此,我們瞭解到,協程相對於普通的函式在於能在程式碼中控制函式進度,這也是協程的優勢所在。
參考文章:Roberto Ierusalimschy—《Lua程式設計》