2 回答
TA贡献1803条经验 获得超6个赞
你启动了 5 个 goroutine,但只读取了一个的输入。此外,您不会等待 goroutines 结束。
// If there are only 5 goroutines unconditionally, you don't need the wg
for i := 1; i <= 5; i++ {
go worker("www"+strconv.Itoa(i), names)
}
for i:=1;i<=5;i++ {
fmt.Println(<-names)
}
然而,如果你不知道你在等待多少个 goroutine,那么等待组是必要的。
for i := 1; i <= 5; i++ {
wg.Add(1)
go worker("www"+strconv.Itoa(i), &wg, names)
}
// Read from the channel until it is closed
done:=make(chan struct{})
go func() {
for x:=range names {
fmt.Println(x)
}
// Signal that println is completed
close(done)
}()
// Wait for goroutines to end
wg.Wait()
// Close the channel to terminate the reader goroutine
close(names)
// Wait until println completes
<-done
TA贡献2019条经验 获得超9个赞
您正在启动 5 个 goroutine,但仅从频道读取names一次。
fmt.Println(<-names)
一旦第一个通道读取完成,就main()退出。
这意味着一切都在有时间执行之前停止。
要了解有关通道的更多信息,请参阅Dave Cheney的“轻松实现并发” :
如果您必须等待操作的结果,那么您自己做会更容易。
以您获得它们的相反顺序释放锁和信号量。
通道不是文件或套接字之类的资源,您无需关闭它们即可释放它们。
准备好使用信号量时获取信号量。
避免混合匿名函数和 goroutines
在你启动一个 goroutine 之前,总是知道它何时以及如何停止
- 2 回答
- 0 关注
- 131 浏览
添加回答
举报
