35. 协程 WaitGroups
想到等待多个协程完成,我们可以使用 wait group。
waitgroups.go
package main
import (
    "fmt"
    "sync"
    "time"
)
// 每个协程都会运行该函数。
// 注意,WaitGroup 必须通过指针传递给函数。
func worker(id int, wg *sync.WaitGroup) {
    fmt.Printf("Worker %d starting\n", id)
    // 睡眠一秒钟,以此来模拟耗时的任务。
    time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
    // 通知 WaitGroup ,当前协程的工作已经完成。
    wg.Done()
}
func main() {
    // 这个 WaitGroup 被用于等待该函数开启的所有协程。
    var wg sync.WaitGroup
    // 开启几个协程,并为其递增 WaitGroup 的计数器。
    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }
    // 阻塞,直到 WaitGroup 计数器恢复为 0,即所有协程的工作都已经完成。
    wg.Wait()
}运行:
$ go run waitgroups.go
Worker 5 starting
Worker 3 starting
Worker 4 starting
Worker 1 starting
Worker 2 starting
Worker 4 done
Worker 1 done
Worker 2 done
Worker 5 done
Worker 3 done每次运行,各个协程开启和完成的时间可能是不同的。
 
           
         
             
             关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
推荐文章: