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