【问题标题】:Why doesn't Go subroutine get executed [duplicate]为什么不执行 Go 子例程 [重复]
【发布时间】:2017-12-06 10:16:11
【问题描述】:

我正在学习围棋,遵循在线教程“围棋之旅”。

在这个练习中:https://tour.golang.org/concurrency/10

在继续解决问题之前,我想尝试一些简单的事情:

func Crawl(url string, depth int, fetcher Fetcher) {
    fmt.Println("Hello from Crawl")
    if depth <= 0 {
        return
    }
    body, urls, err := fetcher.Fetch(url)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("found: %s %q\n", url, body)
    for _, u := range urls {
        fmt.Println("in loop with u = %s", u)
        go Crawl(u, depth-1, fetcher) //I added "go" here
    }
}

我唯一添加的是在递归调用Crawl 之前的go 命令。我预计它不会对行为产生太大影响。

但是打印输出是:

Hello from Crawl
found: http://golang.org/ "The Go Programming Language"
in loop with u =  http://golang.org/pkg/
in loop with u =  http://golang.org/cmd/

我希望在循环的每次迭代中看到Hello from Crawl。 为什么我的Crawl 子程序没有被执行?

【问题讨论】:

  • 我同意链接的问题也回答了我的问题。

标签: go


【解决方案1】:

你的 goroutine 开始了,但是在你做你想做的事情之前就结束了,因为你的 main() 已经完成了。 goroutine 的执行与线程一样独立于主程序,但会在程序停止时终止。所以你需要一个 WaitGroup 来等待 goroutine 完成它们的工作,或者只是调用 time.Sleep() 让主程序休眠一段时间。

【讨论】:

  • 教程还没有涵盖WaitGroup,不过谢谢两位,至少我现在明白了这个问题。
  • 你可以用channel代替WaitGroup,这里的精髓就是你需要等待goroutine完成
  • @NathanH 不客气,继续前进:)
【解决方案2】:

没有什么可以确保您的所有 go 例程在您的程序完成之前结束,我会将您的代码重构为类似于以下内容:

func Crawl(url string, depth int, fetcher Fetcher) {
    fmt.Println("Hello from Crawl")
    if depth <= 0 {
        return
    }
    body, urls, err := fetcher.Fetch(url)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("found: %s %q\n", url, body)
   // Adding waiting group to make sure go routines finishes
    wg := sync.WaitGroup{}
    wg.Add(len(urls))
    for _, u := range urls {
        fmt.Println("in loop with u = %s", u)
        go func() {
           defer wg.Done()
           Crawl(u, depth-1, fetcher)
        }()
    }
    wg.Wait()
}

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多