Lua中的協程和其餘變量同樣,都是第一類值(first-class alue),能夠被保存在變量中,能夠被做爲參數傳遞,能夠被函數返回。
協程有4種狀態:掛起(suspended),運行(running),死亡(dead)和正常(normal)。 Lua爲協程提供了3個基礎接口:create,resume和yield。post
#coroutine.createlua
- 建立一個新的協程,併爲它的運行分配一個獨立的棧
- 協程處於掛起狀態(suspended)
- 接受一個函數做爲參數,這個函數就是協程的主程序塊
- 返回這個協程
- 掛起點被設置爲主程序塊的第一句
#coroutine.resumespa
- 啓動一個協程(第一次啓動或從暫停狀態啓動)
- 自身(若是是協程的話)處於正常狀態,被啓動的協程處於運行狀態
- 第一個參數爲所要啓動的協程
- 協程從它的掛起點開始執行
- 一直執行到被掛起或終止
- 致使協程終止的狀況有兩種:它的主程序塊正常返回、運行過程當中出錯
- 執行結束後,控制權遞交給此協程被激活的地方
#coroutine.yieldcode
- 掛起一個協程
- 協程處於掛起狀態
- 協程的運行狀態被記錄
- 激活它的那個coroutine.resume返回
#協程間通訊orm
- 協程第一次被啓動時,傳遞給coroutine.resume的參數將傳遞給協程的主程序
- 協程掛起時,傳遞給coroutine.yield的參數將做爲上次啓動它的coroutine.resume的返回值返回
- 協程被再次啓動時,傳遞給coroutine.resume的參數將做爲上次掛起它的coroutine.yield的返回值返回
- 協程死亡時,主程序返回的值將做爲上次啓動它的coroutine.resume的返回值返回
#實驗協程
##狀態htm
local function status(str, c) print(str, coroutine.status(c)) end local c1,c2 c1 = coroutine.create(function() status("<c2>", c2) print("before c1 yield") coroutine.yield() print("after c1 yield") end) c2 = coroutine.create(function() status("<c2>", c2) print("before c2 resume c1") coroutine.resume(c1) print("after c2 resume c1") end) status("<c2>", c2) coroutine.resume(c2) status("<c1>", c1) status("<c2>", c2) coroutine.resume(c1) status("<c1>", c1)
輸出:接口
outsky@x201:~/tmp$ lua test.lua
<c2> suspended
<c2> running
before c2 resume c1
<c2> normal
before c1 yield
after c2 resume c1
<c1> suspended
<c2> dead
after c1 yield
<c1> dead
##通訊
local c = coroutine.create(function(...) print("c start:", ...) print("c yield return:", coroutine.yield("c yield")) return "c dead" end) print("main start c") local _,r = coroutine.resume(c, "main start c") print("main resume return:", r) print("--------") print("main resume c") _,r = coroutine.resume(c, "main resume c") print("main resume return again:", r)
輸出:
outsky@x201:~/tmp$ lua test.lua
main start c
c start: main start c
main resume return: c yield
--------
main resume c
c yield return: main resume c
main resume return again: c dead