Lua编程(八)协同程序的高级用法——生产者-消费者问题
2011-11-29 14:55
1791 查看
这个问题是比较经典的啦,基本所有语言的多线程都会涉及到,但是没想到Lua的这个这么复杂
看了好长时间才算看明白,先上个逻辑图:
开始时调用消费者,当消费者需要值时,再调用生产者生产值,生产者生产值后停止,直到消费者再次请求。设计为消费者驱动的设计。
图画的不太好,可以先将Filter遮住,它是过滤器对两个程序之间传递的信息进行处理。去掉Filter逻辑就更清晰些了,就是两个“线程”(其实是两个协同程序)互相调用。resume回到yield处开始,支持嵌套,返回到栈顶的yield位置。yield是非阻塞的“线程同步”。这到有点像linux里的管道通信。
运行结果:
本篇博客出自 阿修罗道,转载请注明出处:/article/1505659.html
看了好长时间才算看明白,先上个逻辑图:
开始时调用消费者,当消费者需要值时,再调用生产者生产值,生产者生产值后停止,直到消费者再次请求。设计为消费者驱动的设计。
图画的不太好,可以先将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 ......
本篇博客出自 阿修罗道,转载请注明出处:/article/1505659.html
相关文章推荐
- 用协同程序实现生产者消费者问题
- Lua编程示例(八):生产者-消费者问题
- UNIX环境高级编程中的11章程序11-2编译问题---undefined reference to `pthread_create'
- Lua编程笔录--Lua初识及语法六(协同程序)
- 线程高级---生产者消费者问题
- 解决unix环境高级编程的第一个程序运行问题
- Linux生产者消费者问题编程实例
- 背过程序-生产者消费者问题
- Java线程与并发编程实践----等待通知(生产者消费者问题)线程
- java简单小结(附一个java实现的生产者消费者问题的程序)
- Java并发编程-10-在锁中使用多条件-生产者消费者问题
- 详解生产者消费者问题 synchronize wait方法 附加生产者唤醒生产者 程序运行不下去的问题
- Linux 系统应用编程——多线程经典问题(生产者-消费者)
- Lua编程(七)协同程序基础逻辑
- TT和LG编程系列之线程(生产者和消费者问题)
- 《windows应用高级编程-C#编程篇》书中程序的小问题及改进
- 操作系统笔记《7》-------生产者、消费者问题 。读者、写者问题 程序实现
- 线程高级---生产者消费者问题
- 多线程程序一段问题代码分析(生产者消费者)
- 举例详解Lua中的协同程序编程