Lua五:协程解决相互调用“谁拥有主循环”问题
2021-10-05 19:55
686 查看
下面用生产者和消费者问题来展示协程如何解决软件架构中“谁拥有主循环”的问题。在一种设计中,程序通过调用消费者启动。当消费者需要新值时就唤醒生产者,生产者向消费者返回新值后挂起,直到消费者再次将其唤醒。因此,我们将这种设计称为消费者驱动( consumer-driven)式的设计。
同时,我们可以使用过滤器来扩展上述设计。过滤器位于生产者和消费者之间,用于完成一些对数据进行某种变换的任务。过滤器(filter) 既是一个消费者又是一一个生产者,它通过唤醒一个生产者来获得新值,然后又将变换后的值传递给消费者。
代码的逻辑可以参照下文来理解:根据“consumer(filter(producer())”,先调用producer()函数,生成一个待启动的协程,这个协程包含的代码段功能是从io流中读取一个值(local x = io.read()),然后调用send ()函数,其功能是挂起正在进行的这个协程。然后从filter(producer())这个命令,函数filter()接收到调用producer()返回的协程,然后函数filter()调用receive ()函数得到producer()函数生成的新数,并和行数一块打印出来(x = string.format("%5d %s", line, x))。最后调用consumer()函数,将函数filter()挂起的协程作为参数,然后重启这个协程,得到producer()函数生成的数,写入io流中。
代码如下:
function receive (prod) local status, value = coroutine .resume (prod) return value end function send (x) coroutine . yield(x) 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 consumer(filter(producer())
相关文章推荐
- java面向对象-使用this语句解决构造器重载相互调用问题
- android的ndk下,解决两个so相互调用的问题
- 解决Maven项目相互依赖/循环依赖/双向依赖的问题
- ASP.NET MVC 解决JSON循环调用的问题
- 编译类【COCOS2DX-LUA 脚本开发之十四】解决自定义CPP类通过TOLUA++ BINDING LUACOCOS2D后编译到ANDROID运行黑屏(没有调用自定义CPP类)的问题!
- 关于c调用lua 对‘luaL_newstate()’未定义的引用的问题解决办法
- 【COCOS2DX-LUA 脚本开发之十四】解决自定义CPP类通过TOLUA++ BINDING LUACOCOS2D后编译到ANDROID运行黑屏(没有调用自定义CPP类)的问题!
- 循环调用$.ajax()引起的问题解决
- 解决Maven项目相互依赖/循环依赖/双向依赖的问题
- Lua调用自定义C++类 和遇到的问题解决
- 如何有效解决C与C++的相互调用问题
- 解决Maven项目相互依赖/循环依赖/双向依赖的问题
- android的ndk下,解决两个so相互调用的问题
- 解决Jqyery的Trigger事件中两个按钮相互触发至死循环问题
- 关于ListView中多个EditText之间相互联动导致无限循环问题的解决方法
- 解决Maven项目相互依赖/循环依赖/双向依赖的问题
- WPF:解决 调用线程无法访问此对象,因为另一个线程拥有该对象。问题
- 在access的vba中循环调用带参数查询时遇到的问题及解决办法
- C#技巧【调用线程无法访问此对象,因为另一个线程拥有该对象的问题的解决办法】【C#读写EXCEL源码提示“office检测到此文件存在一个问题。为帮助保护您的计算机,不能打开此文件”的解决】
- android的ndk下,解决两个so相互调用的问题