面试题答案
一键面试思路
- 在生产者 - 消费者模型中,生产者向通道发送完数据后关闭通道。
- 消费者通过
for... range
循环读取通道数据,当通道关闭时,for... range
会自动结束,无需额外处理错误。 - 为避免死锁,确保生产者和消费者的资源合理分配与释放,例如在并发场景下正确使用
sync.WaitGroup
等同步机制。
代码实现(以Go语言为例)
package main
import (
"fmt"
"sync"
)
func producer(ch chan int, wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 5; i++ {
ch <- i
}
close(ch)
}
func consumer(ch chan int, wg *sync.WaitGroup) {
defer wg.Done()
for num := range ch {
fmt.Println("Consumed:", num)
}
}
func main() {
var wg sync.WaitGroup
ch := make(chan int)
wg.Add(2)
go producer(ch, &wg)
go consumer(ch, &wg)
wg.Wait()
close(ch) // 这里的close(ch)是多余的,因为生产者已经关闭了通道,只是为了展示完整流程
}
在上述代码中:
producer
函数向通道ch
发送数据,发送完毕后关闭通道。consumer
函数使用for... range
读取通道数据,通道关闭时循环自动结束。main
函数中使用sync.WaitGroup
等待生产者和消费者协程完成任务,避免程序提前退出导致死锁或资源未处理的情况。