gpt4 book ai didi

concurrency - sync.WaitGroup 不等待

转载 作者:数据小太阳 更新时间:2023-10-29 03:40:09 24 4
gpt4 key购买 nike

可能是我看不到明显的东西,我做错了什么:

func printSize (listOfUrls []string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
go func(){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}()
}
wg.Wait()
}

如果我删除 wg 并继续,我会正确收到每个 url 正文的大小。如果我像上面那样做,它几乎会立即打印出零。 getUrlBody() 有时需要几分钟才能执行。

回答评论:可以肯定的是,我也以这种方式尝试过,并且它表现出相同的行为。我发现错误在 getUrlBody 和 main() 函数中...

func printSize(listOfUrls []string) {
var wg sync.WaitGroup
wg.Add(len(listOfUrls))
for _, myurl := range listOfUrls {
go f(myurl, &wg)
}
wg.Wait()
}

func f(myurl string, wg *sync.WaitGroup) {
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}

最佳答案

所有的 goroutines 都共享一个 myurl 变量。参见 https://golang.org/doc/faq#closures_and_goroutines获取更多信息。

将代码更改为:

func f(listOfUrls []string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
go func(myurl string){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}(myurl)
}
wg.Wait()
}

func f(listOfUrls []string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
myurl := myurl
go func(){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}()
}
wg.Wait()
}

关于concurrency - sync.WaitGroup 不等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30579752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com