17. Lua 协同程序 解决 生产者与消费者问题

生产者与消费者问题

  • (基础版)消费者为程序入口
    producer = coroutine.create( -- 创建一个协同程序
      function()  -- 生产者
          while true  do
              local x = io.read() -- 产生新的值
              print("生产一个值",x)
              send(x)  -- 挂起生产者协同程序,发送给消费者
          end
      end
    )
    
    function consumer()  -- 消费者
      while true do
          local x = receive()  -- 激活生产者协同程序 ,从生产者接收值
          io.write(x,"\n")  -- 消费新的值
          print("生消费一个值:",x)
      end
    end
    
    function receive() -- 激活一个协同程序 同时传递参数
      local status,value = coroutine.resume(producer)
      return value
    end
    
    function send(x)  -- 挂起一个协同程序 同时传递参数
      coroutine.yield(x)
    end
    
    consumer()  -- 初始化消费者并启动程序
    
  • (扩展版)引入过滤器概念,增强程序功能,消费者为程序入口
    function receive(prod)  -- 激活协同程序
      local status,value = coroutine.resume(prod)
      return value
    end
    
    function send(x)  -- 将协同程序挂起
      coroutine.yield(x)
    end
    
    function producer()  -- 生产者
      return coroutine.create( function()  -- 创建一个协同程序
              while true do
                  local x = io.read() -- 产生新值
                  send(x)
              end
          end
      )
    end
    
    function filter(prod)  -- 过滤器
      return coroutine.create(  -- 创建一个协同程序
          function()
              for line = 1, math.huge do
                  local x = receive(prod)  -- 激活协同程序 获取新值
                  x = string.format("%5d %s",line , x )
                  send(x)  -- 挂起激活程序
              end
          end
      )
    end
    
    function consumer(prod)
      while true do
          local x = receive(prod) -- 获取新值
          io.write(x, "\n")
      end
    end
    
    p= producer()  -- 初始化生产者
    f = filter(p)  -- 初始化过滤器
    consumer(f)  -- 初始化消费者 并 启动程序
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.1程序块:Lua执行的每段代码,例如一个源代码文件或者交互模式中输入的一行代码,都称为一个程序块 1.2注释:...
    c_xiaoqiang阅读 7,417评论 0 9
  • 协同程序可以借助 Java 的线程来理解,不过 Java 的线程可以同时运行多个,而 Lua 的协同程序,同时只能...
    灰气球阅读 734评论 0 0
  • 什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局...
    谁说我是小小云阅读 4,177评论 0 0
  • Lua 协同程序(coroutine) 作者:杨梦鸽 校对:翟舒青 什么是协同(coroutine)? Lua 协...
    木易林1阅读 3,480评论 0 0
  • Lua的协同程序和常见的线程相似,可以具有独立的执行流程,包括所需的数据和内存。 该示例创建了一个协同程序,并将其...
    李小磊_0867阅读 4,057评论 0 3