Lua編程示例(八):生產(chǎn)者-消費(fèi)者問(wèn)題
這個(gè)問(wèn)題是比較經(jīng)典的啦,基本所有語(yǔ)言的多線程都會(huì)涉及到,但是沒(méi)想到Lua的這個(gè)這么復(fù)雜 抓狂
看了好長(zhǎng)時(shí)間才算看明白,先上個(gè)邏輯圖:
開(kāi)始時(shí)調(diào)用消費(fèi)者,當(dāng)消費(fèi)者需要值時(shí),再調(diào)用生產(chǎn)者生產(chǎn)值,生產(chǎn)者生產(chǎn)值后停止,直到消費(fèi)者再次請(qǐng)求。設(shè)計(jì)為消費(fèi)者驅(qū)動(dòng)的設(shè)計(jì)。
圖畫(huà)的不太好,可以先將Filter遮住,它是過(guò)濾器對(duì)兩個(gè)程序之間傳遞的信息進(jìn)行處理。去掉Filter邏輯就更清晰些了,就是兩個(gè)“線程”(其實(shí)是兩個(gè)協(xié)同程序)互相調(diào)用。resume回到y(tǒng)ield處開(kāi)始,支持嵌套,返回到棧頂?shù)膟ield位置。yield是非阻塞的“線程同步”。這到有點(diǎn)像linux里的管道通信。
function receive(prod) print("receive is called") local status,value = coroutine.resume(prod) return value end function send(x,prod) print("send is called") return coroutine.yield(x) end function producer() return coroutine.create(function () print("producer is called") while true do print("producer run again") local x = io.read() send(x) end end) end function filter(prod) return coroutine.create(function () for line = 1,1000 do print("enter fliter "..line) local x = receive(prod) print("receive in filter finished") x= string.format("%5d %s",line,x) send(x,prod) end end) end function consumer(prod) print("consumer is called") while true do print("consumer run again") local x = receive(prod) print("retrun customer") io.write(x,"\n") end end p = producer() f=filter(p) consumer(f)
運(yùn)行結(jié)果:
consumer is called consumer run again receive is called enter fliter 1 receive is called producer is called producer run again fsy send is called receive in filter finished send is called retrun customer 1 fsy consumer run again receive is called enter fliter 2 receive is called producer run again gaga send is called receive in filter finished send is called retrun customer 2 gaga consumer run again receive is called enter fliter 3 receive is called producer run again ......
- Lua編程示例(一):select、debug、可變參數(shù)、table操作、error
- Lua編程示例(二):面向?qū)ο?、metatable對(duì)表進(jìn)行擴(kuò)展
- Lua編程示例(三):稀疏表、雙端隊(duì)列、格式化輸出、表和循環(huán)表的格式化輸出
- Lua編程示例(四):Lua標(biāo)準(zhǔn)庫(kù)之表庫(kù)、字符串庫(kù)、系統(tǒng)庫(kù)
- Lua編程示例(五): C語(yǔ)言對(duì)Lua表的讀取和添加
- Lua編程示例(六): C語(yǔ)言調(diào)用Lua函數(shù)
- Lua編程示例(七):協(xié)同程序基礎(chǔ)邏輯
相關(guān)文章
Lua協(xié)同程序函數(shù)coroutine使用實(shí)例
這篇文章主要介紹了Lua協(xié)同程序函數(shù)coroutine使用實(shí)例,協(xié)程是協(xié)同程序的簡(jiǎn)稱,顧名思義,就是協(xié)同工作的程序,需要的朋友可以參考下2014-09-09Lua編程示例(三):稀疏表、雙端隊(duì)列、格式化輸出、表和循環(huán)表的格式化輸出
這篇文章主要介紹了Lua編程示例(三):稀疏表、雙端隊(duì)列、格式化輸出、表和循環(huán)表的格式化輸出,本文直接給出實(shí)例代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-07-07