首页 > 解决方案 > 使用多个 goroutine 的好处

问题描述

我见过等待一组 goroutine 完成的代码:

var wg sync.WaitGroup
wg.Add(2)
go func() {
    // Do work.
    wg.Done()
}()
go func() {
    // Do some other work.
    wg.Done()
}()
wg.Wait()

这样做的主要好处是什么,而不是让我们说:

var wg sync.WaitGroup
wg.Add(1)
go func() {
    // Do work.
    // Do some more work here instead.
    wg.Done()
}()
wg.Wait()

它更快吗?

标签: goconcurrencygoroutine

解决方案


有些事情要清楚:你的两个例子都使用一个sync.WaitGroup,主要区别是工作的“分布”到goroutines

在您的第一个示例中,您有 2 个并发的 goroutine 执行 2 个不同的工作(任务),而在第二个示例中,您有 1 个单独的 goroutine 依次执行这两个任务,一个接一个。

主要好处可能是2 个 goroutine 可以安排在 2 个 OS 线程中运行,这可能会利用 2 个独立的 CPU 内核,因此它可以更早/更快地完成。它是否提前完成以及完成多少取决于实际任务。

这两个任务甚至可能相互依赖,所以如果你把它们放在一个 goroutine 上,它们可能永远不会完成。


推荐阅读