登录
首页 >  Golang >  Go问答

Golang的未来和WaitGroup永远相连

来源:stackoverflow

时间:2024-02-10 10:12:17 123浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Golang的未来和WaitGroup永远相连》,聊聊,希望可以帮助到正在努力赚钱的你。

问题内容

我编写了以下代码,试图为一组异步作业实现 future。它有效。但我不明白为什么我必须将 wg.wait() 包装在一个 goroutine 中,而 main 会阻塞。

package main

import (
    "fmt"
    "net/http"
    "sync"
)

var urls = []string{
    "https://www.easyjet.com/",
    "https://www.skyscanner.de/",
    "https://www.ryanair.com",
    "https://wizzair.com/",
    "https://www.swiss.com/",
}

func checker(urls []string) func() chan urlStatus {
    wg := &sync.WaitGroup{}
    c := make(chan urlStatus)
    for _, url := range urls {
        wg.Add(1)
        go checkUrl(url, c, wg)
    }
    return func() chan urlStatus {
        go func() { // <--- why this goroutine is necessary. change it to sync will block
            wg.Wait()
            close(c)
        }()
        return c
    }
}
func main() {
    done := make(chan bool)
    
    future := checker(urls)

    go consumer(future(), done)

    <-done
}

func consumer(c <-chan urlStatus, done chan bool) {
    for r := range c {
        if r.status {
            fmt.Println(r.url, "is up.")
        } else {
            fmt.Println(r.url, "is down!!")
        }
    }
    fmt.Println("end of consumer")
    done <- true
}

//checks and prints a message if a website is up or down
func checkUrl(url string, c chan<- urlStatus, wg *sync.WaitGroup) {
    defer wg.Done()
    _, err := http.Get(url)
    if err != nil {
        // The website is down
        c <- urlStatus{url, false}
    } else {
        // The website is up
        c <- urlStatus{url, true}
    }
}

type urlStatus struct {
    url    string
    status bool
}

正确答案


我认为是因为这条线

go consumer(future(), done)

当 future() 被调用时,主 go 例程被 wg.wait() 阻塞

理论要掌握,实操不能落!以上关于《Golang的未来和WaitGroup永远相连》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

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