gpt4 book ai didi

go - 为什么goroutine在 WaitGroup 中仅运行一次

转载 作者:行者123 更新时间:2023-12-01 22:30:41 26 4
gpt4 key购买 nike

func check(name string) string {
resp, err := http.Get(endpoint + name)
if err != nil {
panic(err)
}

defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)

if err != nil {
panic(err)
}

return string(body)

}

func worker(name string, wg *sync.WaitGroup, names chan string) {
defer wg.Done()
var a = check(name)
names <- a
}

func main() {
names := make(chan string)
var wg sync.WaitGroup

for i := 1; i <= 5; i++ {
wg.Add(1)
go worker("www"+strconv.Itoa(i), &wg, names)
}
fmt.Println(<-names)
}
预期结果将是5个结果,但是只有一个执行,并且过程结束。
我有什么想念的吗?新的去。
端点是返回json的通用API

最佳答案

您启动了5个goroutine,但是仅读取了一个输入。另外,您不必等待goroutine结束。

// If there are only 5 goroutines unconditionally, you don't need the wg
for i := 1; i <= 5; i++ {
go worker("www"+strconv.Itoa(i), names)
}
for i:=1;i<=5;i++ {
fmt.Println(<-names)
}
但是,如果您不知道正在等待多少个goroutine,则必须使用waitgroup。
for i := 1; i <= 5; i++ {
wg.Add(1)
go worker("www"+strconv.Itoa(i), &wg, names)
}
// Read from the channel until it is closed
done:=make(chan struct{})
go func() {
for x:=range names {
fmt.Println(x)
}
// Signal that println is completed
close(done)
}()

// Wait for goroutines to end
wg.Wait()
// Close the channel to terminate the reader goroutine
close(names)
// Wait until println completes
<-done

关于go - 为什么goroutine在 WaitGroup 中仅运行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63479962/

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