1 回答
TA贡献1725条经验 获得超7个赞
您当前的程序无法运行,因为无缓冲通道没有消费者。此外,没有必要同时使用WaitGroup两者channel。
考虑下面的例子:
func slow(i int, cha chan int) {
fmt.Println("HI", i)
time.Sleep(time.Second * 2)
cha <- i * 2
}
func main() {
values := make(chan int)
defer close(values)
for i := 1; i < 12; i++ {
go slow(i, values)
}
for i := 1; i < 12; i++ {
fmt.Println(<-values)
}
}
这样我们就可以有一个发送者 goroutine,并且可以在主函数中使用消息。
如果我们只是想确保所有的 goroutine 在 main 完成执行之前完成,我们可以像下面这样删除通道:
func slow(i int, wg *sync.WaitGroup) {
fmt.Println("HI", i)
time.Sleep(time.Second * 2)
wg.Done()
}
func main() {
var wg sync.WaitGroup
for i := 1; i < 12; i++ {
wg.Add(1)
go slow(i, &wg)
}
wg.Wait()
}
使用缓冲通道有效,因为在缓冲区填满之前将消息推送到通道不再阻塞。
- 1 回答
- 0 关注
- 138 浏览
添加回答
举报