[13th][Day10] waiting group

之前有做过一个需求:要打一个 request 一千万次,并收集其 response 以供之後流程处理分析

我的第一个版本写得非常非常纯『蠢』


func main() {
	for i := 1; i < 11; i++ {
		go testInsert(grpcClient, "f"+strconv.Itoa(i)+".txt")
	}
	time.Sleep(3600 * time.Second)

}

func testInsert(grpcClient abc.AbcServiceClient, fileName string) {
	aa1 := getResultWrite(grpcClient, "QWERT", 1000000)
	fmt.Println(aa1)

	f, err := os.Create(fileName)

	defer f.Close()

	if err != nil {
		// fmt.Println(err.Error())
	} else {

		_, err = f.Write([]byte(aa1))
		// fmt.Println(err.Error())
	}
}

缺点:我需要自行调整 time.Sleep 的秒数,否则如果睡完後,func main就直接结束, go routine 还没执行完的话,那本次执行的的任务,收集到的东西会全部消失,浪费 N 分钟

前辈 W大大 帮我加入了 waiting group 的概念 ...


func main() {
    wg := sync.WaitGroup{}

	for i := 1; i <= 10; i++ {
		wg.Add(1)
		go conn.testInsert("f"+strconv.Itoa(i)+".txt", &wg)
	}
	wg.Wait()
}

func (conn *Conn) testInsert(fileName string, wg *sync.WaitGroup) {
	aa1 := conn.getResultWrite(conn.param, conn.fileSize)
	// fmt.Println(aa1)

	f, err := os.Create(fileName)
	defer func() {
		f.Close()
		wg.Done()
	}()

	if err != nil {
		fmt.Println(err.Error())
	} else {
		_, err = f.Write([]byte(aa1))
		// fmt.Println(err.Error())
	}
}
func (wg *WaitGroup) Add(delta int)

Add adds delta, which may be negative, to the WaitGroup counter. If the counter becomes zero, all goroutines blocked on Wait are released. If the counter goes negative, Add panics.

https://pkg.go.dev/sync#WaitGroup.Add
delta 只能为正,负的会 panic
增加可以本 wg 等待的 goroutine 数

func (wg *WaitGroup) Wait()

Wait blocks until the WaitGroup counter is zero.

https://pkg.go.dev/sync#WaitGroup.Wait
阻塞他,堵住,等所有 goroutine 回来

func (wg *WaitGroup) Done()

Done decrements the WaitGroup counter by one.

https://pkg.go.dev/sync#WaitGroup.Done
告知一个 goroutine 已完成


加上 waiting group 的概念可以让工作变得更加活,也不需要自己去调整到底需要几秒钟来让所有的 goroutine 都完成

让 code 变得更加聪明


<<:  [13th][Day12] docker commit

>>:  Day5 Android - Layout版面(下)

Day30 续 -- 三十而已

终於把内容都讲完拉,回顾一下自己写的文章, 发现自己觉得最好的是第一天跟最後一天的标题, 至於内容的...

Stripe

前言 现在越来越多民众喜欢透过网路付款,在网路付款中很重要的环节就是需要进行线上刷卡,提到网路付款和...

Day 26 - Lognormal 分布测试

我前几天针对不同的模型进行测试,神经网路模型拟合较佳,随着神经元的数量增加,拟合状况越好! 但是,每...

【Day 4】DevOps x Containerized x 王大陆都知道的容器化好处

tags: 铁人赛 Docker Container Microservice DevOps 概述 ...

# Day8--物件兄弟党的小弟们:属性与方法

在上一篇的文章中,有提到属性(property)这件事情指的就是类别或结构里面的所包含的变数、常数,...