简介
并发是现代软件开发中的一个关键方面,它使程序能够同时执行多个任务,并有效利用系统资源。在 Go 语言中,WaitGroup 和通道是强大的构造,可用于并发编程。本文探讨了在一个真实场景中简单使用 WaitGroup 和通道的方式,演示了它们如何有效地并行化操作。
WaitGroup
sync.WaitGroup 是 Go 中用于等待一组 Goroutine 完成的同步原语。它允许您协调多个 Goroutine,并确保它们都完成后再继续执行。它的工作原理如下:
1.初始化:使用 var wg sync.WaitGroup 创建一个新的 WaitGroup。
2.添加 Goroutine:在启动 Goroutine 之前,调用 wg.Add(1) 来增加 WaitGroup 的计数器。
3.Goroutine 执行:在每个 Goroutine 内部执行所需的任务,在完成后调用 wg.Done() 来减少计数器。
4.等待完成: 在启动所有 Goroutine 后,调用 wg.Wait() 来阻塞,直到计数器变为零,表示所有 Goroutine 都已完成。
Channel
通道是 Go 中用于在 Goroutine 之间进行通信的基本特性。它们实现了安全的数据交换和同步。以下是简要概述:
1.创建: 使用 make 函数声明一个通道,指定它将携带的数据类型。例如,resultChan := make(chan *DataType)。
2.发送数据: 使用 <- 运算符将数据发送到通道中,例如,resultChan <- data。
3.接收数据: 使用 <- 运算符从通道中接收数据,例如,data := <-resultChan。
4.关闭通道: 在不再需要通道时,关闭通道是很重要的,以表示不会再发送更多的数据。这可以通过 close 函数来完成,例如,close(resultChan)。
5.作用:处理协程执行时间差异的策略
示例:利用 WaitGroup 和通道:
// An highlighted block
func (that *FriendBlocksWithRidsLogic) FriendBlocksWithRids(in *friends.FriendBlocksWithRidsReq) (*friends.FriendBlocksWithRidsResp, error) <