《Programming in Lua 3》讀書筆記(八)

日期: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返回的值.該函數不捕獲任何錯誤,全部的錯誤都由調用者本身傳遞。

具體的使用技術需進一步理解 翻譯

相關文章
相關標籤/搜索