Lua的協程基礎

參考: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的  

相關文章
相關標籤/搜索