golang wg

发布时间:2024-07-05 00:09:37

Go语言中的sync包提供了一系列用于并发控制的工具,其中最重要的之一就是WaitGroup。

WaitGroup的作用

在并发编程中,我们常常需要等待一组并发任务全部完成之后再继续执行后续的代码。传统的做法是使用锁或者信号量等机制进行手动同步。而WaitGroup的作用就是简化这个过程,它可以帮助我们等待一组goroutine的完成。

WaitGroup的基本用法

使用WaitGroup非常简单,它提供了三个主要方法:Add()、Done()和Wait()。

首先,我们需要创建一个WaitGroup对象:

var wg sync.WaitGroup

然后,在每个需要并发执行的任务前调用Add()方法增加WaitGroup的计数:

wg.Add(1)

在任务的结尾处调用Done()方法表示任务已完成:

wg.Done()

最后,使用Wait()方法阻塞主goroutine,直到所有任务都完成:

wg.Wait()

实例演示:并发下载文件

下面我们通过一个简单的实例演示如何使用WaitGroup实现并发下载文件的功能。

func download(url string, wg *sync.WaitGroup) {
    defer wg.Done()

    // 下载逻辑
    // ...
}

func main() {
    var wg sync.WaitGroup

    urls := []string{"url1", "url2", "url3"}

    for _, url := range urls {
        wg.Add(1)
        go download(url, &wg)
    }

    wg.Wait()

    fmt.Println("所有文件下载完成")
}

在这个例子中,我们定义了一个download函数来模拟文件的下载操作,每个下载任务执行完成后都会调用wg.Done()来通知WaitGroup。主函数中,我们将需要下载的文件URL放进一个切片中,然后使用for循环并发执行下载任务,并在每次下载任务前通过wg.Add(1)增加WaitGroup的计数。最后,我们使用wg.Wait()阻塞主goroutine,直到所有下载任务都完成。

WaitGroup的一些注意事项

在使用WaitGroup时,有一些需要特别注意的地方:

  1. WaitGroup不能被复制:WaitGroup应该被作为指针传递给goroutine,以避免复制产生的歧义。
  2. 确保调用Done()的次数与Add()的次数相等:如果Done()的次数大于Add()的次数,Wait()将永远阻塞。
  3. 不要在WaitGroup中使用锁:WaitGroup本身是线程安全的,不需要额外的互斥锁。

通过合理使用WaitGroup,我们可以轻松地实现并发任务的同步和等待。

相关推荐