【发布时间】:2021-11-07 20:46:44
【问题描述】:
WaitGroups 用于等待所有 goroutine 在继续执行之前完成,但是当它们完成时如何处理它们的输出?
这个方法没问题
c := make(chan string)
rc := 0
for _, url := range urls {
rc++
go func(url string) {
data := get(url)
c <- data
}(url)
}
for i := 0; i < rc; i++ {
data <- c
}
但是当你必须从 goroutines 调用 goroutines 时它会停止工作
for _, url := range urls {
go func(url string) {
data := get(url)
urls := get_urls(data)
for _, url := range urls {
go func(url){
data := get(url)
c <- data
}(url)
}
}(url)
}
这一次我们必须将rc++ 放在 goroutine 中,这将导致未定义的行为。做什么?
【问题讨论】:
-
不要计算。在频道范围内,让你的经理 goroutine 在工作人员完成后关闭频道。收到所有结果后,结果通道范围将自然退出。
-
@colm.anseo manager goroutine 怎么知道?
-
通过
sync.WaitGroup
标签: go concurrency synchronization web-crawler goroutine