Luaプログラミング(八)協同プログラムの高度な使い方--生産者-消費者問題

2001 ワード

この問題は比較的古典的で、基本的にすべての言語のマルチスレッドが関わっていますが、Luaのこれがこんなに複雑だとは思いませんでした. 
  長い間見てやっと分かったので、まず論理図に行きます.
  
    開始時に消費者を呼び出し、消費者が値を必要とする場合、生産者の生産値を呼び出し、生産者の生産値が再び要求されるまで停止する.消費者駆動の設計に設計されています.
   絵があまりよくないので、まず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