首页 > 其他分享 >go基础 - WaitGroup用法

go基础 - WaitGroup用法

时间:2022-08-16 00:14:30浏览次数:81  
标签:wg WaitGroup 协程 fmt 主线 用法 go

go基础 - WaitGroup用法

package main

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

/**
 * Created by Goland
 * User: wkk [email protected]
 * 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 ---------------------------*/

标签:wg,WaitGroup,协程,fmt,主线,用法,go
From: https://www.cnblogs.com/alisleepy/p/16590175.html

相关文章

  • Golang实现set
    背景Golang语言本身未实现set,但是实现了mapgolang的map是一种无序的键值对的集合,其中键是唯一的而set是键的不重复的集合,因此可以用map来实现setEmpty由于map是key-va......
  • mongo数据库-mongo角色权限
    Built-InRoles(内置角色):1.数据库用户角色:read、readWrite;2.数据库管理角色:dbAdmin、dbOwner、userAdmin;3.集群管理角色:clusterAdmin、clusterManager、clu......
  • 代码审计(Java)——WebGoat_Xss
    一、写在前面刚刚入职,适应了几天后抓紧开始学习,毕竟学无止境且自己太菜了……面试的时候,负责人问了我一些关于Java代审的问题,不过之前接触的更多是php的代审。熟......
  • go 通过sql操作mysql
    GoLang学习更方便,一文在手,面试我有GoLang面试|GoLang面试|GoLang面试go通过sql操作mysql亲测、2022/08/1520:53北京朝阳@目录前言go代码sql汇总-增删改查......
  • keras.utils.to_categorical方法
    用法:to_categorical(y,num_classes=None,dtype='float32')将整型的类别标签转为onehot编码。y为int数组,num_classes为标签类别总数,大于max(y)(标签从0开始的)。返回:如果n......
  • golang之Redis
    Redis是一个基于内存的非关系型数据库,在项目开发中使用非常广泛,Go语言操作Redis需要使用三方包,我们选择支持Redis集群和Redis哨兵的go-redis包来讲述Go语言如......
  • 28.虚拟语气在其他句型中的用法
    1.虚报语气在itis(high/about)time(that)...句型中的用法在itis(high/about)time(that)..句型中,后面的从句要用虚拟语气,从句谓语动词用过去式,也可用“should+动......
  • golang之jwt的token登录
    什么是JSONWebToken?JSONWebToken(JWT)是一个开放标准(RFC7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON方式安全地传输信息。由于此信息是经过数字签名的......
  • 24.虚拟语气在非真实条件句中的用法
    1.虚拟语气在假设过去情况的条件句中的用法  在表示对过去情况假设的非真实条件句中,从句应用过去完成时,即从句的谓语动词应用“had+过去分词”的形式,主句的谓语动词应......
  • VUE+Django前后端分离-第三部分【前后端数据传递】
    一、前端代码首先:前端中任何变量都要被定义,具体如下:   <template><div><h3>推置引擎测试界面</h3><el-form:inline="true":model="for......