Lua编程示例(八):生产者-消费者问题实用指南
平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“Lua编程示例(八):生产者-消费者问题”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
从实现思路看,这个问题是比较经典的啦,基本所有语言的多线程都会涉及到,但是没想到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编程示例(一):select、debug、可变参数、table操作、error
- Lua编程示例(二):面向对象、metatable对表进行扩展
- Lua编程示例(三):稀疏表、双端队列、格式化输出、表和循环表的格式化输出
- Lua编程示例(四):Lua标准库之表库、字符串库、系统库
- Lua编程示例(五): C语言对Lua表的读取和添加
- Lua编程示例(六): C语言调用Lua函数
- Lua编程示例(七):协同程序基础逻辑
相关资讯
-
09.03
Beethoven Sonata DSD 256 Collage
-
09.03
MiniMax_Agent连续任务执行流程
-
09.03
taobao.item.reviews.get-风格分类和名称参
-
09.03
Neon Diamond Double Portrait Composite
-
09.03
Transparent Earbuds on Stone Pedestal
-
09.03
完整指南Ruby中正则表达式对字符串的匹配和替换操作
游戏推荐
推荐专题
热门阅读
-
- 豆包“工作任务”模式升级,支持手机远程操控电脑
- 09.03
-
-
- 讯飞智作声音复刻背景杂音导致训练失败
- 09.03
-
-
-
- 音述AI分轨批量任务单独导出单条轨道处理
- 09.03
推荐下载
-
-
下载
- |
-
-
下载
- 《行尸走肉第一章》免安装中文汉化硬盘版下载
- 单机|436 MB
- 一款以动作冒险为主题的游戏
-
-
下载
- 《街头霸王X铁拳》免安装中文汉化硬盘版下载
- 单机|111MB
- 一款非常好玩的格斗游戏
-
-
下载
- |
-
-
下载
- 《暗黑破坏神3》免安装繁体中文正式版下载
- 单机|7630 MB
- 一款以角色扮演为主题的游戏
-
-
下载
- 《马克思佩恩3》免安装硬盘版下载
- 单机|27033 MB
- 一款以第三人称射击为主题的游戏