美文网首页
【Go - sync.WaitGroup】

【Go - sync.WaitGroup】

作者: wn777 | 来源:发表于2024-07-29 22:59 被阅读0次

    wg.Add(delta int)sync.WaitGroup 类型的一个方法,用于设置或调整等待组中的计数器。参数 delta 表示要添加到等待组计数器的值,它可以是正数、负数或零。

    参数含义

    • delta:
      • delta 为正数时,它增加等待组的计数器,通常表示有新的协程任务开始执行。
      • delta 为负数时,它减少等待组的计数器,表示一个或多个协程任务已经完成。
      • delta 为零时,实际上不会改变计数器的值,但通常不会这样使用。

    具体用法

    在启动一组协程之前,通过调用 wg.Add(n) 来设置等待组的计数器,其中 n 是即将并发执行的协程数量。每个协程在其执行结束前调用 wg.Done() 来减少等待组的计数器。wg.Done() 实际上是 wg.Add(-1) 的简便调用。主协程通过调用 wg.Wait() 阻塞,直到等待组的计数器减到零,即所有协程都已完成。

    示例

    var wg sync.WaitGroup
    
    func worker(id int) {
        defer wg.Done() // 在结束时通知WaitGroup任务已完成
        fmt.Printf("Worker %d starting\\n", id)
        // 执行任务...
        fmt.Printf("Worker %d done\\n", id)
    }
    
    func main() {
        numWorkers := 5
        wg.Add(numWorkers) // 设置等待的协程数量
    
        for i := 1; i <= numWorkers; i++ {
            go worker(i) // 启动协程
        }
    
        wg.Wait() // 等待所有协程完成
        fmt.Println("All workers completed")
    }
    
    

    原理

    sync.WaitGroup 内部维护一个计数器和一个等待队列。当计数器大于零时,wg.Wait() 会阻塞。当计数器为零时,wg.Wait() 不会阻塞,如果有协程因调用 wg.Wait() 而阻塞,它们会被唤醒。这使得 sync.WaitGroup 成为协调多个协程执行完成的理想选择。

    相关文章

      网友评论

          本文标题:【Go - sync.WaitGroup】

          本文链接:https://www.haomeiwen.com/subject/otgwhjtx.html