登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-03-23 12:20:04 315浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《使用 sync.WaitGroup 和频道的 Golang 应用程序永远不会退出》主要内容涉及到golang等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我使用sync.WaitGroup,defer 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

下载完所有报价后,该程序不应该退出吗?(仅供参考:我刚开始学习 GO)

正确答案

您永远不会关闭fetchedSymbols通道,因此范围循环将永远不会退出。

处理此问题的一种方法是使用 WaitGroup,您必须在何时关闭通道时发出信号。测距fetchedSymbols足以阻止 main 中的进度,您不需要另一个通道或 WaitGroup。

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

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

...

理论要掌握,实操不能落!以上关于《使用 sync.WaitGroup 和频道的 Golang 应用程序永远不会退出》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表