簡體   English   中英

sync.WaitGroup不等待

[英]sync.WaitGroup doesnt waits

可能是我看不到明顯的東西,我在做什么錯:

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

所有goroutine都共享一個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()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM