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

 更新时间:2015年07月09日 10:51:36   投稿:junjie  
这篇文章主要介绍了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中的if语句的使用方法

    详解Lua中的if语句的使用方法

    这篇文章主要介绍了详解Lua中的if语句的使用方法,是Lua入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Lua和C++的通信流程代码实例

    Lua和C++的通信流程代码实例

    这篇文章主要介绍了Lua和C++的通信流程代码实例,本文是上一篇的DEMO,本文用代码讲解Lua和C++之间的通信,需要的朋友可以参考下
    2014-09-09
  • 把Lua编译进nginx步骤方法

    把Lua编译进nginx步骤方法

    这篇文章主要介绍了把Lua编译进nginx步骤方法,本文讲解了操作步骤以及可能出现的错误解决方法,需要的朋友可以参考下
    2015-06-06
  • Lua教程(四):函数详解

    Lua教程(四):函数详解

    这篇文章主要介绍了Lua教程(四):函数详解,本文讲解了多重返回值、变长参数、具名实参、闭合函数、匿名函数、非全局函数等内容,需要的朋友可以参考下
    2015-04-04
  • Lua中关系运算符的使用教程

    Lua中关系运算符的使用教程

    这篇文章主要介绍了Lua中关系运算符的使用教程,是Lua学习入门中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Lua教程(四):在Lua中调用C语言、C++的函数

    Lua教程(四):在Lua中调用C语言、C++的函数

    这篇文章主要介绍了Lua教程(四):在Lua中调用C语言、C++的函数,本文给出了多个示例讲解如何在Lua中调用C/C++写的函数,需要的朋友可以参考下
    2014-09-09
  • Lua教程(二十):Lua调用C函数

    Lua教程(二十):Lua调用C函数

    这篇文章主要介绍了Lua教程(二十):Lua调用C函数,本文讲解了C函数作为应用程序的一部分、C函数库成为Lua的模块等内容,需要的朋友可以参考下
    2015-04-04
  • 使用Lua编写Web端模板引擎的实例代码分享

    使用Lua编写Web端模板引擎的实例代码分享

    这里我们给出一个使用Lua编写Web端模板引擎的实例代码分享,力求简洁(核心代码约为70行),仅实现最基本的模板功能:
    2016-06-06
  • Lua中的元表(metatable)、元方法(metamethod)详解

    Lua中的元表(metatable)、元方法(metamethod)详解

    这篇文章主要介绍了Lua中的元表(metatable)、元方法(metamethod)详解,本文对它做了详细讲解,并给出实例来说明,需要的朋友可以参考下
    2014-09-09
  • Lua教程(三):值与类型介绍

    Lua教程(三):值与类型介绍

    这篇文章主要介绍了Lua教程(三):值与类型介绍,本文起讲解了Lua的八种基本类型、userdata、thread、table等内容,需要的朋友可以参考下
    2015-03-03

最新评论