佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Lua編程示例(八):生產(chǎn)者-消費者問題

Lua編程示例(八):生產(chǎn)者-消費者問題

熱門標(biāo)簽:呼叫中心市場需求 網(wǎng)站排名優(yōu)化 百度競價排名 服務(wù)外包 AI電銷 地方門戶網(wǎng)站 鐵路電話系統(tǒng) Linux服務(wù)器

這個問題是比較經(jīng)典的啦,基本所有語言的多線程都會涉及到,但是沒想到Lua的這個這么復(fù)雜 抓狂
  看了好長時間才算看明白,先上個邏輯圖:

   開始時調(diào)用消費者,當(dāng)消費者需要值時,再調(diào)用生產(chǎn)者生產(chǎn)值,生產(chǎn)者生產(chǎn)值后停止,直到消費者再次請求。設(shè)計為消費者驅(qū)動的設(shè)計。
   圖畫的不太好,可以先將Filter遮住,它是過濾器對兩個程序之間傳遞的信息進(jìn)行處理。去掉Filter邏輯就更清晰些了,就是兩個“線程”(其實是兩個協(xié)同程序)互相調(diào)用。resume回到y(tǒng)ield處開始,支持嵌套,返回到棧頂?shù)膟ield位置。yield是非阻塞的“線程同步”。這到有點像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)


運行結(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對表進(jìn)行擴(kuò)展
  • Lua編程示例(三):稀疏表、雙端隊列、格式化輸出、表和循環(huán)表的格式化輸出
  • Lua編程示例(四):Lua標(biāo)準(zhǔn)庫之表庫、字符串庫、系統(tǒng)庫
  • Lua編程示例(五): C語言對Lua表的讀取和添加
  • Lua編程示例(六): C語言調(diào)用Lua函數(shù)
  • Lua編程示例(七):協(xié)同程序基礎(chǔ)邏輯

標(biāo)簽:衡水 湘潭 崇左 黃山 湖南 蘭州 銅川 仙桃

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua編程示例(八):生產(chǎn)者-消費者問題》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    广宁县| 隆德县| 枣庄市| 无棣县| 宝坻区| 岱山县| 满城县| 沙湾县| 深水埗区| 稻城县| 定州市| 上思县| 苏尼特左旗| 鄂州市| 忻城县| 雅江县| 博野县| 延庆县| 莱西市| 呼玛县| 简阳市| 金溪县| 那坡县| 宣化县| 金平| 马山县| 梁河县| 渝中区| 文山县| 井冈山市| 仁布县| 自贡市| 恩平市| 东乌| 大足县| 嘉荫县| 宣汉县| 宁乡县| 平塘县| 姜堰市| 天柱县|