You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:33:21