golang WaitGroup拷贝

发布时间:2024-07-07 18:15:35

Go语言的WaitGroup(等待组)是一个用于等待一组goroutine完成任务的工具。它可以用来实现多个并发任务之间的同步,确保在所有任务完成之后再继续执行下一步操作。在并发编程中,等待组是一种非常常用的技术,在Go语言中通过sync包提供的WaitGroup类型可以很方便地实现。

使用WaitGroup的基本流程

使用WaitGroup的基本流程可以概括为以下三步:

1. 创建WaitGroup对象

首先,需要创建一个WaitGroup对象。可以使用sync包提供的WaitGroup类型来创建,不需要进行额外的初始化操作。

2. 增加计数

在每个需要等待的goroutine之前,先调用WaitGroup对象的Add方法,将计数值加1。这表示当前有一个goroutine需要等待。

3. 完成任务

在每个goroutine任务完成之后,调用WaitGroup对象的Done方法。这表示当前的goroutine已经完成了任务。

当所有的goroutine都完成了任务之后,再调用WaitGroup对象的Wait方法进行等待。此时等待组会一直阻塞,直到所有的计数值都减为0,即所有的goroutine都完成了任务。

一个简单的示例

下面我们来看一个使用WaitGroup的简单示例:

package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup

	wg.Add(2) // 增加计数值为2,表示有两个goroutine需要等待

	go func() {
		defer wg.Done() // 任务完成后调用Done方法,表示当前goroutine已经完成了任务
		fmt.Println("goroutine 1 完成任务")
	}()

	go func() {
		defer wg.Done()
		fmt.Println("goroutine 2 完成任务")
	}()

	wg.Wait() // 等待所有的goroutine都完成任务
	fmt.Println("所有任务完成")
}

运行上面的代码,可以看到输出结果如下:

goroutine 1 完成任务
goroutine 2 完成任务
所有任务完成

从输出结果可以看出,两个goroutine先后完成任务,然后主线程输出"所有任务完成"。其中,主线程在调用wg.Wait()方法时会被阻塞,直到所有的goroutine都完成任务。

WaitGroup的注意事项

在使用WaitGroup时,有一些需要注意的事项:

1. Add方法和Done方法必须成对出现

Add方法用于增加计数值,Done方法用于减少计数值。它们必须成对出现,即每个Add方法后必须接一个Done方法。否则会导致Wait方法一直阻塞,无法继续执行。

2. 可以在任意位置调用Wait方法

Wait方法可以在任意位置进行调用,不必一定要等到所有的goroutine都完成任务之后才调用。但是需要注意的是,调用Wait方法时计数值必须为零,否则会导致Wait方法一直阻塞。

3. 不要复用WaitGroup对象

在使用WaitGroup时,不要复用同一个WaitGroup对象进行多轮的任务处理。应该创建新的WaitGroup对象来处理每一轮的任务,以避免出现计数值混乱的情况。

通过使用WaitGroup,我们可以很方便地实现多个并发任务之间的同步。它是一个非常实用的工具,可以在并发编程中起到重要的作用。

相关推荐