• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > Lua编程示例(八):生产者-消费者问题

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

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了安全生产执法文书示例,安全生产示例,lua文件解密,lua,lua语言等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

这个问题是比较经典的啦,基本所有语言的多线程都会涉及到,但是没想到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)

</div>


运行结果:

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
......

</div> </div>

您可能想查找下面的文章:

  • lua闭包的理解以及表与函数的几种表达方法
  • Lua编程示例(八):生产者-消费者问题

相关文章

  • Lua中函数的几个特别之处探究
  • Lua和C++的通信流程分解
  • Lua中table的一些辅助函数介绍
  • Lua中的变量和流控制入门学习
  • Lua中字符串(string)浅析
  • Lua中类的实现
  • Lua中获取table长度问题探讨
  • Lua中实现面向对象的一种漂亮解决方案
  • Lua编程示例(四):Lua标准库之表库、字符串库、系统库
  • Lua检测数组(tabble)中是否包含某个值

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua教程(十四):字符串库详解
    • Lua简介、编译安装教程及变量等语法介绍
    • Lua中的元方法__newindex详解
    • Lua学习笔记之数据类型
    • Lua中使用模块的一些基础知识
    • Lua脚本语言概述
    • Lua中的变量和流控制入门学习
    • Lua在windows下的安装及环境配置
    • Lua中算术运算符的使用示例
    • Lua性能优化技巧(六):最后的提示

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有