Go语言协程并发---等待组sync.WaitGroup

package main

import (
	"fmt"
	"sync"
	"time"
)

/*等待组API介绍*/
func main071() {
	var wg sync.WaitGroup
	fmt.Println(wg)

	//向等待组添加一个协程(注册)
	wg.Add(1)

	//从等待组减掉一个协程(注销)
	wg.Done()

	//阻塞等待至等待组中的协程数归零
	wg.Wait()
}

/*
·分别使用Ticker和Timer创建耗时协程A,B
·将A,B,C两个协程加入等待组
·A,B,C结束时从等待组注销
·主协程阻塞至等待组内协程数归零
*/

func main() {
	//声明等待组
	var wg sync.WaitGroup

	//每开辟一个协程就向等待组中+1
	wg.Add(1)
	go func() {
		fmt.Println("协程A开始工作")
		time.Sleep(3 * time.Second)
		fmt.Println("协程A over")

		//协程结束,从等待组中注销(协程数-1)
		wg.Done()
	}()

	//每开辟一个协程就向等待组中+1
	wg.Add(1)
	go func() {
		fmt.Println("协程B开始工作")
		//timer := time.NewTimer(3 * time.Second)
		//<- timer.C
		<-time.After(5 * time.Second)
		fmt.Println("协程B over")

		//协程结束,从等待组中注销(协程数-1)
		wg.Done()
	}()

	//每开辟一个协程就向等待组中+1
	wg.Add(1)
	go func() {
		fmt.Println("协程C开始工作")
		ticker := time.NewTicker(time.Second)
		for i := 0; i < 4; i++ {
			<-ticker.C
		}
		ticker.Stop()
		fmt.Println("协程C over")

		//协程结束,从等待组中注销(协程数-1)
		wg.Done()
	}()

	//阻塞等待wg中的协程数归零
	wg.Wait()
	fmt.Println("main over")
}

  

猜你喜欢

转载自www.cnblogs.com/yunweiqiang/p/12770923.html