A5下载 - 努力做内容最丰富最安全的下载站!

A5站长下载站

当前位置:A5下载 > 源码技巧 > 父类数据 > Lua编程示例(八):生产者-消费者问题

Lua编程示例(八):生产者-消费者问题

时间:2015-07-09 15:39作者:zhao人气:60

这个问题是比较经典的啦,基本所有语言的多线程都会涉及到,但是没想到Lua的这个这么复杂 抓狂看了好长时间才算看明白,先上个逻辑图:

开始时调用消费者,当消费者需要值时,再调用生产者生产值,生产者生产值后停止,直到消费者再次请求。设计为消费者驱动的设计。

图画的不太好,可以先将Filter遮住,它是过滤器对两个程序之间传递的信息进行处理。去掉Filter逻辑就更清晰些了,就是两个“线程”(其实是两个协同程序)互相调用。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,"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

......

 

标签Lua,编程,示例,生产者,消费者,问题,这个,问题是,比较

相关下载

查看所有评论+

网友评论

网友
您的评论需要经过审核才能显示

公众号