sync.WaitGroup没有等待

时间:2015-06-01 17:39:05

标签: concurrency go

可能是我看不出明显的事情,我做错了什么:

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()
 }

1 个答案:

答案 0 :(得分:2)

所有goroutine都在共享单个null变量。有关详细信息,请参阅https://golang.org/doc/faq#closures_and_goroutines

将代码更改为:

myurl

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()
}