Lua协程改造问题:消费者为协程、生产者为主线程异常排查
Lua消费者协程+生产者主线程模型修复方案
问题根源
Lua协程是协作式调度,原模型的挂起/唤醒逻辑是生产者协程挂起等待消费者,改造后需要反转调度逻辑:消费者协程需主动挂起等待生产者数据,主线程(生产者)要负责唤醒协程执行处理逻辑。你的代码异常是因为协程调度顺序错误,消费者的格式化代码未被调度执行。
修复方案(保留receive绑定消费者、send绑定接收方的设计)
1. 修正协程通信的挂起/唤醒逻辑
receive():让消费者协程挂起,等待主线程传递数据send(x):由主线程调用,唤醒消费者协程并传入数据
2. 完整可运行代码示例
-- 全局变量保存消费者协程对象 local consumer_co = nil -- 消费者协程调用receive,挂起等待数据 function receive() local _, data = coroutine.resume(consumer_co) return data end -- 主线程调用send,唤醒消费者协程并传递数据 function send(x) coroutine.yield(x) end -- 消费者协程:负责格式化处理数据 function consumer_filter() while true do local raw_data = receive() -- 挂起,等待主线程发送数据 -- 执行自定义格式化逻辑,示例为添加标识前缀 local formatted_data = string.format("[已格式化] %s", raw_data) print("处理结果:", formatted_data) end end -- 主线程(生产者):生成输入并发送给消费者 function main_producer() -- 创建消费者协程 consumer_co = coroutine.create(consumer_filter) while true do io.write("请输入待处理数据(输入空行退出):") local input = io.read() if not input or input == "" then print("程序退出") break end -- 唤醒消费者协程,传递输入数据 send(input) end end -- 启动生产者主线程 main_producer()
3. 关键逻辑说明
- 消费者协程启动后,第一次调用
receive()会触发coroutine.resume,协程进入consumer_filter循环,执行到coroutine.yield(x)时挂起,将数据返回给receive() - 主线程输入数据后调用
send(x),本质是触发协程的yield返回,协程会继续执行格式化代码,完成后回到receive()再次挂起,等待下一次数据输入
内容的提问来源于stack exchange,提问作者kos
相关产品推荐
相关产品推荐

