最近老是發現以前看過的知識點,過幾天,再久一點,幾個月,然後就忘得一乾二淨了。
歸根結底,還是缺少總結。習慣了以前讀書填鴨式的學習方法,逐漸喪失主動獨立思考的能力。閱讀的時候看似理解了,實則只是簡單掌握部分要點,並沒有真正吃透。
於是,我決定重新開始一點一滴地記錄所看過的書或者教程,從中提煉較有價值的內容,既加強自己對文章的理解,也方便日後索引。
今天主要重新瞭解了lua協程函數的使用方法。參閱的文章地址:http://www.runoob.com/lua/lua-coroutine.html
協同程序,簡稱協程。lua協程有三種狀態:掛起(suspend)、運行(running)、結束(dead)。
lua的協程總共就6個函數,琢磨每個函數的功能和使用場合,就基本理解了lua協程。
lua協程函數如下
函數名稱 | 描述 | 參數 | 返回值 |
---|---|---|---|
coroutine.create() | 創建一個協程 | 傳入參數是一個function | 返回一個協程對象 |
coroutine.resume() | 運行指定的協程 | 變長參數。 第一個參數是協程對象,即coroutine.create的返回值。其他參數爲協程函數的參數值。 協程函數指的是coroutine.create傳入的函數。 |
多返回值。第一個返回值表示協程運行的結果(true/false),其他返回值爲coroutine.yield傳入的參數值 |
coroutine.yield() | 掛起當前運行的協程。 | 變參。 傳入的參數都作爲coroutine.resume的返回值。 |
? |
coroutine.status() | 獲取指定協程的運行狀態。 | 協程對象,即coroutine.create的返回值。 | 枚舉值。dead,suspend,running. |
coroutine.running() | 獲取正在運行的協程。 | 無 | 協程對象所在的線程地址 |
coroutine.wrap() | 創建一個協程,返回一個函數。一旦調用這個函數,就進入協程,功能與coroutine.create類似。 |
create, resume, yield是最主要的,其他使用場合比較少。這三個函數就可以產生很多美妙的組合。
文章有句話寫得很中肯。
resume
處於主程中,它將外部狀態(數據)傳入到協同程序內部;而yield
則將內部的狀態(數據)返回到主程中。
最常見的生產者-消費者模型,就可以通過lua協程來實現。(例子引用自參閱文章1)
local newProductor
function productor()
local i = 0
while true do
i = i + 1
send(i) -- 將生產的物品發送給消費者
end
end
function consumer()
while true do
local i = receive() -- 從生產者那裏得到物品
print(i)
end
end
function receive()
local status, value = coroutine.resume(newProductor)
return value
end
function send(x)
coroutine.yield(x) -- x表示需要發送的值,值返回以後,就掛起該協同程序
end
-- 啓動程序
newProductor = coroutine.create(productor)
consumer()
參閱文章