sync包中的WaitGroup实现了一个类似任务队列的结构,你可以向队列中加入任务,任务完成后就把任务从队列中移除,如果队列中的任务没有全部完成,队列就会触发阻塞以阻止程序继续运行。WaitGroup主要有以下三个方法

    1. // 计数器增加 delta,delta 可以是负数。
    2. func (wg *WaitGroup) Add(delta int)
    3. // 计数器减少 1
    4. func (wg *WaitGroup) Done()
    5. // 等待直到计数器归零。如果计数器小于 0,则该操作会引发 panic。
    6. func (wg *WaitGroup) Wait()

    add 会给WaitGroup的counter加1,done会给WaitGroup的counter减1,当WaitGroup的counter的是0 则解除阻塞,否则一定要等任务都执行完毕后再继续执行接下来的操作。

    1. import (
    2. "fmt"
    3. "math/rand"
    4. "sync"
    5. "time"
    6. )
    7. func work(name string,workTime time.Duration,sysGroup *sync.WaitGroup){
    8. defer sysGroup.Done()
    9. fmt.Printf("%s start work\n",name)
    10. time.Sleep(time.Second*workTime)
    11. fmt.Printf("After %d sec %s finid work\n",workTime,name)
    12. }
    13. func main() {
    14. var sysGroup sync.WaitGroup
    15. for i :=0;i<3;i++{
    16. sysGroup.Add(1)
    17. go work(fmt.Sprintf("Worker-%d",i), time.Duration(rand.Intn(10)),&sysGroup)
    18. }
    19. sysGroup.Wait()
    20. fmt.Printf("all people finish work\n")
    21. }