我使用sync.WaitGroup,defer wg.Close()并wg.Wait()等待我的 goroutine 完成。該程序確實等待,但它永遠不會退出。這是我的程序(可運行):package mainimport ( "fmt" "io" "log" "net/http" "os" "sync")var symbols = []string{ "ASSA-B.ST", "ELUX-B.ST", "HM-B.ST",}func main() { fmt.Println("fetching quotes...") fetchedSymbols := make(chan string) var wg sync.WaitGroup wg.Add(len(symbols)) for _, symbol := range symbols { go fetchSymbol(symbol, &wg, fetchedSymbols) } for response := range fetchedSymbols { fmt.Println("fetched " + response) } wg.Wait() fmt.Println("done")}func fetchSymbol(symbol string, wg *sync.WaitGroup, c chan<- string) { defer wg.Done() resp, err := http.Get("http://ichart.yahoo.com/table.csv?s=" + symbol + "&a=0&b=1&c=2000") defer resp.Body.Close() if err != nil { log.Fatal(err) } out, err := os.Create("./stock-quotes/" + symbol + ".csv") defer out.Close() if err != nil { log.Fatal(err) } io.Copy(out, resp.Body) c <- symbol}下載完所有報價后,該程序不應(yīng)該退出嗎?(僅供參考:我剛開始學習圍棋)
1 回答

倚天杖
TA貢獻1828條經(jīng)驗 獲得超3個贊
您永遠不會關(guān)閉fetchedSymbols通道,因此范圍循環(huán)永遠不會退出。
處理此問題的一種方法是使用您已經(jīng)必須發(fā)出信號的 WaitGroup 何時關(guān)閉通道。測距在fetchedSymbols足以阻止主要的進步,你并不需要另一個通道或WaitGroup。
...
go func() {
wg.Wait()
close(fetchedSymbols)
}()
for response := range fetchedSymbols {
fmt.Println("fetched " + response)
}
...
- 1 回答
- 0 關(guān)注
- 135 瀏覽
添加回答
舉報
0/150
提交
取消