lua協程知識點總結

最近老是發現以前看過的知識點,過幾天,再久一點,幾個月,然後就忘得一乾二淨了。

歸根結底,還是缺少總結。習慣了以前讀書填鴨式的學習方法,逐漸喪失主動獨立思考的能力。閱讀的時候看似理解了,實則只是簡單掌握部分要點,並沒有真正吃透。

於是,我決定重新開始一點一滴地記錄所看過的書或者教程,從中提煉較有價值的內容,既加強自己對文章的理解,也方便日後索引。

今天主要重新瞭解了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()

參閱文章

  1. Lua 協同程序(coroutine)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章