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

本文介绍了在Lua中使用协程实现生产者-消费者问题的示例,包括基本版和扩展版,后者加入了过滤器功能。通过`coroutine.create()`、`io.read()`、`send()`和`receive()`等函数,展示了如何处理并发数据流和增强程序功能。

生产者与消费者问题

  • (基础版)消费者为程序入口
    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)  -- 初始化消费者 并 启动程序
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值