go基础 - WaitGroup用法

go基础 - WaitGroup用法

package main

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

/**
 * Created by Goland
 * User: wkk alisleepy@hotmail.com
 * Time: 2022/8/15 - 23:33
 * Desc: <描述信息>
 */

func main() {
	fmt.Println("主线程 start。。")
	// 1、协程练习
	//goroutineTest()

	// 2、协程执行结束,主线程再结束,需要用到 WaitGroup
	var wg sync.WaitGroup // 定义一个wg
	waitGroupTest(&wg)
	wg.Wait() // 阻塞状态,直到所有的协程执行完成,然后再继续执行主线程

	fmt.Println("主线程 end。。")
}

/*------------------------ goroutine start ---------------------------*/
func goroutineTest() {
	fmt.Println("协程练习 start...")

	// 开启1000个协程
	for i := 0; i < 1000; i++ {
		// 匿名函数,闭包
		//go func(i int) {
		//	fmt.Printf("打印数字:%d\n", i)
		//}(i)

		// 调用方法
		go P(i)
	}

	// sleep2秒,保证协程全部执行完成,再执行主线程
	time.Sleep(2 * time.Second) // 如果没有这个,可能会主线程执行结束退出,开启的协程也自动退出
	fmt.Println("协程练习 end...")
}

func P(i int) {
	fmt.Printf("打印数字:%d\n", i)
}

/*------------------------ goroutine end ---------------------------*/

/*------------------------ waitGroup start ---------------------------*/
/**
Add(n int) :每次开启协程前调用该方法,计数器+1
Done() :协程每次执行完成后调用该方法,计数器-1
Wait() : 主线程中调用该方法,使得主线程等待中,阻塞主线程执行,直到所有线程全部执行完成,计数器 = 0,然后不再阻塞主线程
*/
func waitGroupTest(wg *sync.WaitGroup) {
	for i := 0; i < 10000; i++ {
		// 每次新开启goroutine,先add 加 1
		wg.Add(1)
		go wp(i, wg)
	}
}

func wp(i int, wg *sync.WaitGroup) {
	// 每次执行完协程中的任务,执行done方法,表示执行完成
	defer wg.Done() // 防止漏写Done方法,可以通过defer写在前边,在执行完之后及时Done
	fmt.Printf("打印数字:%d\n", i)
}

/*------------------------ waitGroup end ---------------------------*/

posted @ 2022-08-16 00:03  alisleepy  阅读(36)  评论(0编辑  收藏  举报