【问题标题】:Benefit of using multiple goroutines使用多个 goroutine 的好处
【发布时间】:2020-03-20 12:42:15
【问题描述】:

我见过等待一组 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()

更快吗?

【问题讨论】:

  • 两个示例都使用单个等待组。不同的是,在第一个示例中,两个任务同时运行,而在第二个任务中,它们串联运行。哪个是正确的或“有益的”,显然取决于所做工作的性质。
  • 第二个例子不使用并发;您可以删除WaitGroupgo,它的运行方式相同。
  • @Adrian 谢谢 - 所以如果我想拆分“工作量”,如果我要执行三个函数,我会使用三个 goroutine 并更改为 wg.Add(3) .. 吗?

标签: go concurrency goroutine


【解决方案1】:

需要明确的一些事情:您的两个示例都使用单个 sync.WaitGroup,主要区别在于将工作“分配”到 goroutines

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

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

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

【讨论】:

    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2021-09-27
    • 2015-06-03
    • 1970-01-01
    • 2020-08-02
    • 2018-04-05
    相关资源
    最近更新 更多