go - 等待例程完成的正确方法

标签 go channel goroutine

我想知道在退出程序之前等待 go 例程完成的正确方法是什么。阅读其他一些答案似乎 bool chan 可以解决问题,如 Playground link

func do_stuff(done chan bool) {
    fmt.Println("Doing stuff")
    done <- true
}

func main() {
    fmt.Println("Main")
    done := make(chan bool)
    go do_stuff(done)
    <-done
    //<-done
}

这里有两个问题:

  • 为什么 <- done 有效?

  • 如果我取消注释最后一行会怎样?我有一个死锁错误。这是因为 channel 是空的,没有其他函数向它发送值吗?

最佳答案

收听 channel <- done , 是一个阻塞操作,所以你的程序不会继续,直到发送 true 或 false 即 done <- true .

根据情况,您的问题可能有几个不同的答案。

例如,假设您想并行化一系列需要很长时间的函数调用。

我会使用 sync为此打包

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            longOp()
            wg.Done()
        }()
    }
    // will wait until wg.Done is called 10 times
    // since we made wg.Add(1) call 10 times
    wg.Wait()
}

func longOp() {
    time.Sleep(time.Second * 2)
    fmt.Println("long op done")
}

关于go - 等待例程完成的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25954481/

相关文章:

go - 尝试实现死锁时使用零的无限循环

go - 使用for循环遍历 channel 时出现Goroutine死锁

go - 在 Web 应用程序中运行计划任务

go - 步数未知的并行for循环

go - 使用 channel 的 MapReduce 任务

go - 如何在golang结构中使用bit而不是bool?

go - golang 中 server.GracefulStop() 的行为

go - 这个 if 序列可以写得更优雅吗?

anaconda - 重置 conda channel 优先级

go - 所有 channel 都陷入僵局