--[[ function producer() while true do local x = io.read() send(x) end end function consumer() while true do local x = receive() io.write(x,"\n") end end ]]--
functionreceive(prob) localstatus,value = coroutine.resume(prob) return value end
functionsend(x) coroutine.yield(x) --接收到数据发送的请求后,就把当前协程给挂起 end
---生产者 functionproducer() returncoroutine.create(function() whiletruedo local x = io.read() send(x) --生产完以后发给协程挂起,下次resume得到的就是挂起的第一个值 end end) end
--消费者需要值时请求,生产者生产值通知消费者
--filter类似于装饰器 --receive接收到消费者的协程 --自己创建了一个协程,然后每次调用的时候,先从协程中取一个值 --然后把这个值再送回协程挂起...??? --也就是说它实际上是用来对当前处理的这个值做处理的一个协程 --实际的调用方式就是 --消费者->filter过滤器从生产者通过send取到值->自己对这个值进行处理以后使用send进行yield return这个值 -- ->传给consumer的那个receive -> 结束一次请求 functionfilter(prob) returncoroutine.create(function() local line = 1 whiletruedo local x = receive(prob) --get new value x = string.format("%5d %s",line,x) send(x) line = line + 1 end end) end
functionconsumer(prob) whiletruedo local x = receive(prob) io.write(x,"\n") end end