[ir a la serie de idiomas] sincronización.WaitGroup

Directorio de artículos

autor: ningan123
fecha: 2023-03-21 11:05
actualizado: 2023-03-21 11:09

ilustrar

La descripción de WaitGroup en el documento oficial es: 一个 WaitGroup 对象可以等待一组协程结束. El método de uso es:

  1. La rutina principal  wg.Add(delta int) establece el número de rutinas de trabajadores llamando y luego crea rutinas de trabajadores;
  2. Una vez ejecutada la rutina del trabajador, se debe llamar  wg.Done();
  3. La rutina principal se llama  wg.Wait() y se bloquea hasta que se ejecutan todas las rutinas de los trabajadores y luego regresa.

manifestación

Dé un ejemplo para ilustrar el problema.

Las siguientes tres pequeñas demostraciones pueden lograr la misma función, pero la siguiente es más elegante que la anterior.

package main

import (
	"fmt"
	"sync"
)

// // 方法1
// func main() {
    
    
// 	for i := 0; i < 100; i++ {
    
    
// 		go fmt.Println(i)
// 	}
// 	time.Sleep(time.Second)
// }



// // 方法2
// func main() {
    
    
// 	num := 100
// 	c := make(chan bool, num)
// 	for i := 0; i < num; i++ {
    
    
// 		go func(i int) {
    
    
// 			fmt.Println(i)
// 			c <- true
// 		}(i)
// 	}

// 	for i := 0; i < num; i++ {
    
    
// 		<-c
// 	}
// }




// 方法3
func main() {
    
    
	wg := sync.WaitGroup{
    
    }
	num := 20
	wg.Add(num)
	for i := 0; i < num; i++ {
    
    
		go func(i int) {
    
    
			// wg.Done()  // 放这会有问题
			fmt.Println(i)
			// wg.Done()
		}(i)
	}
	wg.Wait()
}

Para el método 3, wg.Done() debe colocarse después de finalizar la escritura; de lo contrario, habrá problemas.

Cuando wg.Done() se coloca en la posición 1, el siguiente es el resultado de ejecutar el código dos veces. Se puede ver que es probable que el proceso principal finalice antes de que comience a ejecutarse la rutina.

############## wg.Done()放在位置1处 ##############
# go run main.go
9
2
0
# go run main.go
9
0
1
2
3
4
5
6
7
8

No hay problema si wg.Done() se coloca en la posición 2. Cada vez que la corrutina en waitGroup se reduce en 1 después de que se ejecuta, no tendrá ningún efecto ~

referencia

# Golang sync.WaitGroup uso
sync.WaitGroup explicación detallada

Supongo que te gusta

Origin blog.csdn.net/weixin_42072280/article/details/129684644
Recomendado
Clasificación