本文介绍一种简洁、类型安全的 go 并发模式:在请求结构体中嵌入响应 channel,使工作协程能将计算结果直接回传给发起 http 请求的 goroutine,实现无锁、同步语义的异步处理。
在构建高并发 HTTP 服务时,若需对耗时极高的计算任务(如 SAT 求解)进行串行化或限流处理,常采用“请求队列 + 单/固定 worker”模型。但关键挑战在于:如何让阻塞等待的 HTTP handler 安全、高效地获取最终结果?Go 的 channel 天然支持双向通信,最佳实践是将响应通道作为请求的一部分显式传递——这避免了全局映射、超时管理、竞态清理等复杂逻辑。
✅ 推荐方案:Request-Embedded Response Channel
定义请求与响应结构体,其中 RespCh 是专用于单次响应的无缓冲 channel(也可用带缓冲 channel 提升吞吐,但需注意内存生命周期):
type Request struct {
Input int
RespCh chan<- Result // 只写通道,更安全
}
type Result struct {
Value int
Err error
}
? 提示:使用 chan
? 服务端:Worker 循环处理并回传
启动一个长期运行的 worker goroutine,从请求 channel 消费任务,执行计算后将结果发送至 req.RespCh: