go并发编程之三(sync保持所有goroutine的完整执行WaitGroup)

本文详细介绍了Go语言中的sync.WaitGroup,包括它的定义和使用方法。WaitGroup提供了一种安全等待多个goroutine执行完成的方式。通过Add、Done和Wait三个函数,可以确保所有任务的完整执行。文中通过一个发送邮件和写日志的并发操作实例,展示了如何使用WaitGroup,强调了在使用中必须注意值传递的问题,以避免同步错误。
摘要由CSDN通过智能技术生成

WaitGroup的使用说明

1. WaitGroup的定义

WaitGroup定义了三个函数,分别是

Add : 添加任务
Done : 任务完成
Wait : 等待任务完成

通过这三个函数,我们可以安全等待多个异步的goutine的执行完成,示意图如下

在这里插入图片描述

2. WaitGroup的使用

举个栗子,比如我们同时调用了两个goroutine帮我们执行发邮件和写日志的操作,但是我们无法得知这两个任务是否已经完成了,这时我们就可以用到 WaitGroup,直接上代码

package main

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

func sendEmail(email string ,group *sync.WaitGroup) {
	//这里做了一系列耗时的操作
	time.Sleep(3*time.Second)
	fmt.Println(email, "send a email success ")
	defer group.Done()
}

func writeLog(log string ,group *sync.WaitGroup){
	//假设这里做了一系列写日志操作
	time.Sleep(2*time.Second)
	fmt.Println( log," success ")
	defer group.Done()
}


func main() {
	var waitGroup sync.WaitGroup

	email := "123@126.com"
	log := "oper email "

	waitGroup.Add(2)
	go sendEmail(email ,&waitGroup)
	go writeLog(log ,&waitGroup)

	waitGroup.Wait()
	fmt.Println("done all the work ")
}

打印结果:
oper email success
123@126.com send a email success
done all the work

需要注意的是:go中所有的参数传递是值传递,而 WaitGroup 为了保持同步一致性,需要修改该结构体的值,所以我们使用 & 传递参数,并用 * 指针来接收,否则,会出现:

sync: negative WaitGroup counter

这种错误,究其根源,就是传值问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值