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