簡體   English   中英

使用sync.WaitGroup和頻道的Golang應用程序永不退出

[英]Golang app using sync.WaitGroup & channels never exits

我使用sync.WaitGroupdefer wg.Close()wg.Wait()來等待我的goroutine完成。

該程序確實會等待,但是它永遠不會退出。

這是我的程序(可運行):

package main

import (
    "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
}

下載所有報價后,該程序是否應該退出? (僅供參考:我剛剛開始學習GO)

您永遠不會關閉fetchedSymbols通道,因此范圍循環將永遠不會退出。

解決此問題的一種方法是使用WaitGroup,您已經必須在關閉通道時發出信號。 覆蓋fetchedSymbols足以阻止main的進度,並且您不需要其他通道或WaitGroup。

...
go func() {
    wg.Wait()
    close(fetchedSymbols)
}()

for response := range fetchedSymbols {
    fmt.Println("fetched " + response)
}

...

暫無
暫無

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

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