欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2015年07月09日 10:51:36   投稿:junjie  
這篇文章主要介紹了Lua編程示例(八):生產(chǎn)者-消費(fèi)者問(wèn)題,本文直接給出實(shí)例代碼,需要的朋友可以參考下

這個(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
......

相關(guān)文章

  • Lua的堆棧淺析

    Lua的堆棧淺析

    這篇文章主要介紹了Lua的堆棧淺析,本文參考游戲人工智能編程案例精粹中的Lua堆棧索引圖,畫(huà)出了自己的一張理解圖,需要的朋友可以參考下
    2014-09-09
  • 詳解Lua中的數(shù)據(jù)類型

    詳解Lua中的數(shù)據(jù)類型

    這篇文章主要介紹了Lua中的數(shù)據(jù)類型,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Lua table類型學(xué)習(xí)筆記

    Lua table類型學(xué)習(xí)筆記

    這篇文章主要介紹了Lua table類型學(xué)習(xí)筆記,本文講解了table的基礎(chǔ)知識(shí)和table庫(kù)函數(shù)的使用以及面向?qū)ο缶幊虒?shí)例,需要的朋友可以參考下
    2015-04-04
  • Lua協(xié)同程序函數(shù)coroutine使用實(shí)例

    Lua協(xié)同程序函數(shù)coroutine使用實(shí)例

    這篇文章主要介紹了Lua協(xié)同程序函數(shù)coroutine使用實(shí)例,協(xié)程是協(xié)同程序的簡(jiǎn)稱,顧名思義,就是協(xié)同工作的程序,需要的朋友可以參考下
    2014-09-09
  • Lua編程示例(三):稀疏表、雙端隊(duì)列、格式化輸出、表和循環(huán)表的格式化輸出

    Lua編程示例(三):稀疏表、雙端隊(duì)列、格式化輸出、表和循環(huán)表的格式化輸出

    這篇文章主要介紹了Lua編程示例(三):稀疏表、雙端隊(duì)列、格式化輸出、表和循環(huán)表的格式化輸出,本文直接給出實(shí)例代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下
    2015-07-07
  • Lua判斷數(shù)據(jù)類型的方法

    Lua判斷數(shù)據(jù)類型的方法

    這篇文章主要介紹了Lua判斷數(shù)據(jù)類型的方法,本文講解了判斷數(shù)據(jù)類型的方法和Lua腳本語(yǔ)言的8種基本數(shù)據(jù)類型,需要的朋友可以參考下
    2015-04-04
  • Lua教程(二十):Lua調(diào)用C函數(shù)

    Lua教程(二十):Lua調(diào)用C函數(shù)

    這篇文章主要介紹了Lua教程(二十):Lua調(diào)用C函數(shù),本文講解了C函數(shù)作為應(yīng)用程序的一部分、C函數(shù)庫(kù)成為L(zhǎng)ua的模塊等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • 淺談Lua語(yǔ)句

    淺談Lua語(yǔ)句

    Lua支持大多數(shù)傳統(tǒng)的語(yǔ)句,跟C語(yǔ)言和Pascal差不多。傳統(tǒng)的語(yǔ)句包括:賦值,控制結(jié)構(gòu),流程調(diào)用等。Lua還支持一些不太傳統(tǒng)的語(yǔ)句,例如多賦值(聽(tīng)起來(lái)有點(diǎn)怪,往下看就明白了)和局部變量聲明(這個(gè)好像也是傳統(tǒng)的吧)。
    2015-05-05
  • Lua操作字符串的5個(gè)代碼片段分享

    Lua操作字符串的5個(gè)代碼片段分享

    這篇文章主要介紹了Lua操作字符串的5個(gè)代碼片段分享,本文講解了匹配字符串中的數(shù)字、字母和下劃線、替換字符串中的指定字符、判斷字符串中是否有目標(biāo)字串、從文件的絕對(duì)路徑中獲取到文件名等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Lua中的弱引用介紹

    Lua中的弱引用介紹

    這篇文章主要介紹了Lua中的弱引用介紹,本文用一個(gè)實(shí)例講解了Lua弱引用的相關(guān)知識(shí),需要的朋友可以參考下
    2015-04-04

最新評(píng)論