Go中用channel实现生产者消费者模型的核心是利用其阻塞特性和goroutine并发:生产者写入并关闭channel,消费者用range或双返回值读取,多协程共用channel需WaitGroup同步关闭,加done channel支持优雅退出。

Go语言中用管道(channel)实现生产者消费者模型非常自然,核心在于利用channel的阻塞特性和goroutine的轻量并发能力。
生产者:向channel发送数据
生产者通常是一个或多个goroutine,负责生成数据并写入channel。注意channel需预先创建,容量可设为0(同步)或大于0(带缓冲)。
- 若使用无缓冲channel,发送操作会阻塞,直到有消费者接收——天然实现“有产必消”
- 若使用带缓冲channel(如 ch := make(chan int, 10)),生产者可在缓冲未满时非阻塞发送
- 生产完成后应关闭channel(close(ch)),方便消费者感知结束
消费者:从channel接收数据
消费者通过range循环或<-ch语法读取channel。推荐用range,它会在channel关闭后自动退出。
- for v := range ch { ... } 是最简洁安全的消费写法
- 若需区分“零值”和“关闭信号”,可用双返回值形式:v, ok := <-ch,ok为false表示channel已关闭
- 多个消费者可并发读同一channel,Go运行时自动调度,无需额外锁
协调多个生产者与消费者
常见模式是启动N个生产goroutine、M个消费goroutine,共用一个channel。关键点在于同步退出:
立即学习“go语言免费学习笔记(深入)”;
- 所有生产者结束后关闭channel,确保消费者不会永久等待
- 可用sync.WaitGroup等待所有生产者完成,再调用close()
- 避免在多个goroutine中重复关闭channel(panic),只由生产方统一关闭
带退出控制的健壮模型
真实场景常需支持提前终止。可引入一个额外的done channel,让消费者监听退出信号:
- 消费者用select同时监听数据channel和done channel
- 收到done信号后立即退出,避免处理残留数据
- 主协程在需要停止时向done发送信号,并等待消费者goroutine结束


















