Luaプログラミング(八)協同プログラムの高度な使い方--生産者-消費者問題
2001 ワード
この問題は比較的古典的で、基本的にすべての言語のマルチスレッドが関わっていますが、Luaのこれがこんなに複雑だとは思いませんでした.
長い間見てやっと分かったので、まず論理図に行きます.
開始時に消費者を呼び出し、消費者が値を必要とする場合、生産者の生産値を呼び出し、生産者の生産値が再び要求されるまで停止する.消費者駆動の設計に設計されています.
絵があまりよくないので、まずFilterを隠すことができます.これはフィルタが2つのプログラム間で伝達された情報を処理します.Filterロジックを削除すると、2つの「スレッド」(実は2つの協同プログラム)が互いに呼び出されます.resumeはyieldに戻り、ネストをサポートし、スタックの上部のyield位置に戻ります.yieldは非ブロックの「スレッド同期」です.これはlinuxのパイプ通信に似ています.
実行結果:
ブログは 阿修羅道、転載は出典を明記してください:http://blog.csdn.net/fansongy/article/details/7023332
長い間見てやっと分かったので、まず論理図に行きます.
開始時に消費者を呼び出し、消費者が値を必要とする場合、生産者の生産値を呼び出し、生産者の生産値が再び要求されるまで停止する.消費者駆動の設計に設計されています.
絵があまりよくないので、まずFilterを隠すことができます.これはフィルタが2つのプログラム間で伝達された情報を処理します.Filterロジックを削除すると、2つの「スレッド」(実は2つの協同プログラム)が互いに呼び出されます.resumeはyieldに戻り、ネストをサポートし、スタックの上部のyield位置に戻ります.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,"
")
end
end
p = producer()
f=filter(p)
consumer(f)
実行結果:
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
......
ブログは 阿修羅道、転載は出典を明記してください:http://blog.csdn.net/fansongy/article/details/7023332