參考:Lua中的協同程序 coroutine http.luahtml
協同程序(Coroutine):python
三個狀態:suspended(掛起,協同剛建立完成時或者yield以後)、running(運行)、dead(函數走完後的狀態,這時候不能再從新resume)。git
coroutine.create(arg):根據一個函數建立一個協同程序,參數爲一個函數github
coroutine.resume(co):使協同從掛起變爲運行(1)激活coroutine,也就是讓協程函數開始運行;(2)喚醒yield,使掛起的協同接着上次的地方繼續運行。該函數能夠傳入參數函數
coroutine.status(co):查看協同狀態post
coroutine.yield():使正在運行的協同掛起,能夠傳入參數lua
優勢:能夠經過resume-yield來交換數據url
示例代碼一:spa
消費者驅動的生產者-消費者模型設計
produceFunc = function() while true do local value = io.read() print("produce: ", value) coroutine.yield(value) -- 返回生產的值給coroutine.resume() end end consumer = function(p) while true do local status, value = coroutine.resume(p); -- 喚醒生產者進行生產,並接受coroutine.yield()的值進行消費 print("consume: ", value) end end -- 消費者驅動的設計,也就是消費者須要產品時找生產者請求,生產者完成生產後提供給消費者 producer = coroutine.create(produceFunc) consumer(producer)
在生產消費環節之間加入一箇中間處理的環節(過濾器):
produceFunc = function() while true do local value = io.read() print("produce: ", value) coroutine.yield(value) -- 返回生產的值 end end filteFunc = function(p) while true do local status, value = coroutine.resume(p); value = value *100 -- 放大一百倍 coroutine.yield(value) end end consumer = function(f, p) while true do local status, value = coroutine.resume(f, p); -- 喚醒生產者進行生產 print("consume: ", value) end end -- 消費者驅動的設計,也就是消費者須要產品時找生產者請求,生產者完成生產後提供給消費者 producer = coroutine.create(produceFunc) filter = coroutine.create(filteFunc) consumer(filter, producer)
示例代碼二:
生產者驅動的生產者-消費者模型
local co_yield = coroutine.yield local co_create = coroutine.create local co_status = coroutine.status local co_resume = coroutine.resume consumeFunc = function() for i = 1,10 do local value = co_yield() -- 經過coroutine.yield()來接收 coroutine.resume()傳遞的值 print("consume: ",value) end end produceFunc = function(consumer) for i = 1,10 do local value = io.read() print("produce: ",value) co_resume(consumer, value) -- 喚醒消費者進行消費 end end consumer = co_create(consumeFunc) co_resume(consumer) -- 喚醒消費準備開始消費 produceFunc(consumer)
注意:在啓動coroutine的時候,resume的參數是傳給主程序的;在喚醒yield的時候,參數是傳遞給yield的