日期:2014.7.3
Coroutine(協同程序)
2014.7.10補充
(純粹翻譯書)
Lua中的協同程序相似於多線程概念中的線程:逐行執行,有本身獨立的棧空間,本身的局部變量,本身的指令指針;可是Lua中的協同程序能夠共享全局變量,而且能夠多個協同程序間互相共享幾乎任何變量。與線程最主要的區別在於:理論上講,一個程序能夠並行運行多個線程,可是Lua中的協同程序一次只能運行一個,而且協同程序只能在被明確掛起的時候掛起。
看中文版的時候再瞭解一番。
2014.7.10補充
Lua將全部協同程序用到的函數都存儲在一個叫作coroutine的table裏面。
一些函數:
一、coroutine.create(param) --建立一個協同程序
該函數帶一個參數,參數爲一個function,爲協同程序要運行的函數;函數的返回值爲一個thread類型的值,表明這個新建立的協同程序
多線程
e.g. co = coroutine.create(function() return 6,7 end) print(co) --thread:
--我的理解
剛建立的協同程序其狀態是suspended的,掛起狀態
二、coroutine.status(fun) --返回fun的狀態:running or suspended or dead or normal函數
e.g. --此時打印其狀態 coroutine.status(co) --suspended
而coroutine.resume則運行這個
三、coroutine.resume(fun) --運行funspa
e.g. coroutine.resume(co) --true 6,7 返回true
coroutine.yield則只能在協同程序內部使用,在外部調用會報錯
四、coroutine.yield(fun) --轉換fun狀態,將其status從running轉換到suspended
在協同程序內部使用,能夠控制程序的運行線程
e.g. co = coroutine.create(function ( ... ) for i=1,10 do print(i) end end) print(coroutine.status(co)) --suspended print(coroutine.resume(co)) --此時1 ~ 10 將所有會打印出來 print(coroutine.status(co)) --dead
co = coroutine.create(function ( ... ) for i=1,10 do print(i) coroutine.yield(co) end end) print(coroutine.status(co)) --suspended print(coroutine.resume(co)) --此時只會打印 1 其狀態轉換爲suspended print(coroutine.status(co)) --suspended print(coroutine.resume(co)) --接着執行打印了1以後的下一步,打印出2 print(coroutine.status(co)) --suspended
一個協同程序resume以後,其狀態由suspended轉換爲running,運行完以後其狀態變爲dead,此時再resume則會返回false,指出 cannot resume dead coroutine
五、coroutine.wrap
建立一個coroutine,可是它並不返回coroutine自己,而是返回一個函數取而代之。該函數會返回全部應該由除第一個(錯誤代碼的那個布爾量)以外的由coroutine.resume返回的值.該函數不捕獲任何錯誤,全部的錯誤都由調用者本身傳遞。
具體的使用技術需進一步理解 翻譯