**及注釋如下,使用print函式列印值和行號,可以看到**的執行路徑
--[[
resume協程,如果協程執行的過程中呼叫yield函式,則resume函式返回yield的引數
]]function receive(prod)
local status, value = coroutine.resume(prod)
print(value, debug.getinfo(1).currentline)
return value
end--[[
若是在乙個協程裡呼叫yield函式,則會掛起當前協程
]]function send(x)
print(x, debug.getinfo(1).currentline)
coroutine.yield(x)
end--[[
建立乙個協程;生產、停止生產、將生產的東西發給消費者
]]function producer()
return coroutine.create(function ()
while true do
local x = io.read() -- 生產商品
print(x, debug.getinfo(1).currentline)
send(x) --停止生產、返回商品
endend)
end--[[
消費者是乙個迴圈,當需要消費的時候,就喚醒生產者
然後將商品列印出來
]]function consumer(prod)
while true do
local x = receive(prod) -- 從生產者那裡獲得商品
print(x, debug.getinfo(1).currentline)
io.write(x, "\n")
endendconsumer(producer())
--[[
執行結果:
hello -- 輸入
hello 27
hello 16
hello 7
hello 41
hello -- io.write輸出
]]
理解:
生產者是乙個協程,將生產者的執行過程傳給消費者「consumer(producer())」,消費者什麼時候商品需要就呼叫receive函式,讓生產者生產,然後消費掉。生產者被消費者喚醒之後「resume」,就開始生產"io.read",生產完成之後,就馬上停工"yield",將商品給消費者"yield之後,商品由resume函式返回"。
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...
生產者消費者
using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...
生產者消費者
執行緒通訊 乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務.wait 等待 如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態,等待狀態下的執行緒必須要被其他執行緒呼叫notify方法才能喚醒。notify 喚醒 喚醒執行緒池等待執行緒其中的乙個。notifyall 喚...