返回

从并发到并行:掌握 Go 中的 sync.WaitGroup

后端

从并发到并行:解析 Go 中的 sync.WaitGroup

在现代软件开发中,并发编程变得越来越普遍,因为它允许应用程序充分利用多核处理器。Go 语言提供了丰富的并发编程特性,其中一个重要的工具就是 sync.WaitGroup。sync.WaitGroup 可以用来协调多个 goroutine 的执行,使其在执行特定任务之前等待彼此。

并发与并行

在讨论 sync.WaitGroup 之前,我们先来了解一下并发和并行的区别。并发是指多个任务可以同时开始执行,而并行是指多个任务可以同时在不同的处理器上执行。在 Go 中,goroutine 是轻量级的线程,可以并发执行。

sync.WaitGroup

sync.WaitGroup 是一个用于协调 goroutine 执行的同步机制。它允许一个 goroutine 等待其他一组 goroutine 完成其任务,然后再继续执行。sync.WaitGroup 由两个主要方法组成:Add() 和 Done()。

Add() 方法 :用于增加等待 goroutine 的数量。当一个新的 goroutine 开始执行时,调用 Add() 方法来增加等待计数。

Done() 方法 :用于减少等待 goroutine 的数量。当一个 goroutine 完成其任务时,调用 Done() 方法来减少等待计数。

使用 sync.WaitGroup

以下是一个使用 sync.WaitGroup 的简单示例:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(i int) {
            fmt.Println("Hello from goroutine", i)
            wg.Done()
        }(i)
    }

    wg.Wait()
    fmt.Println("All goroutines have finished")
}

在这个示例中,我们创建了一个 sync.WaitGroup 并使用 Add() 方法为每个 goroutine 增加等待计数。然后,我们启动 5 个 goroutine,每个 goroutine 都打印一条消息并调用 Done() 方法来减少等待计数。最后,我们使用 Wait() 方法等待所有 goroutine 完成,然后再继续执行后续代码。

优势

使用 sync.WaitGroup 有以下优势:

  • 易于使用: Add() 和 Done() 方法简单易用,使得协调 goroutine 执行变得非常容易。
  • 高效: sync.WaitGroup 是一个轻量级的同步机制,不会对应用程序的性能造成显著影响。
  • 可靠: sync.WaitGroup 是一种可靠的机制,可以确保所有 goroutine 在继续执行之前都完成其任务。

结论

sync.WaitGroup 是 Go 语言中一个非常有用的工具,可以用来协调 goroutine 的执行。它易于使用、高效且可靠,使并发编程变得更加容易和安全。了解 sync.WaitGroup 的工作原理和如何使用它,对于编写健壮且可扩展的并发 Go 应用程序至关重要。