sync.WaitGroup 및 Go에서 채널 사용 시 교착 상태 이해
개발자는 sync.WaitGroup을 사용할 때 Go 애플리케이션이 종료되지 않는 문제에 자주 직면합니다. 그리고 채널. 이 문서에서는 이러한 교착 상태의 이유를 살펴보고 WaitGroup을 사용하여 솔루션을 제공합니다.
제공된 예제 코드를 고려하세요.
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 }
이 코드에서 fetchedSymbols에 대한 범위 루프는 기본 무기한 기능합니다. 왜? fetchedSymbols 채널은 절대 닫히지 않기 때문입니다. 이 교착 상태를 해결하기 위해 WaitGroup을 사용하여 채널을 닫을 시기를 알릴 수 있습니다.
... go func() { wg.Wait() close(fetchedSymbols) }() for response := range fetchedSymbols { fmt.Println("fetched " + response) } ...
WaitGroup은 이미 모든 고루틴이 완료될 때를 추적하므로 fetchedSymbols 채널 닫기를 트리거하는 데 활용할 수 있습니다. , 범위 루프가 정상적으로 종료되도록 합니다.
위 내용은 Go에서 `sync.WaitGroup`과 채널 조합이 교착 상태로 이어지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!