gpt4 book ai didi

使用 sync.WaitGroup 和 channel 的 Golang 应用程序永远不会退出

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:58 25 4
gpt4 key购买 nike

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

程序会等待,但它永远不会退出。

这是我的程序(可运行):

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 channel ,因此范围循环永远不会退出。

处理此问题的一种方法是使用您已经必须在关闭 channel 时发出信号的 WaitGroup。遍历 fetchedSymbols 足以阻止 main 中的进度,并且您不需要其他 channel 或 WaitGroup。

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

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

...

关于使用 sync.WaitGroup 和 channel 的 Golang 应用程序永远不会退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50137191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com