golang canal concurrente utilizando sync.WaitGroup asegurar que todo el extremo corrutina y manejar el negocio adicional

Descripción del problema

Si la solicitud es http muchos matriz, ID de servidor para obtener la matriz para realizar negocios, pero este negocio desde hace mucho tiempo para enseñar ejecutado, luego, no puede ejecutar el ciclo, múltiples dejó golang corrutina juegan un papel, pero creo que para algunos Identificación del resultado devuelto por un tratamiento especial, debe asegurarse de que todos los corrutina haber terminado la carrera con el fin de devolver un resultado, creo que el ID en el canal y luego a paso la idea más corrutina es correcto, pero para asegurarse de que todos los co-rutina de ejecución precisa sync.WaitGroup completo con toda la razón, tal vez hay una mejor manera, pero esto es lo que quiero ideas.

código

package main

import (
   "fmt"
   "sync"
)

func main() {
   var ch chan int = make(chan int,10)
   var wg sync.WaitGroup
   var balance = [...]int{1,2,3,4,5,6,7,8,9}
    j := 0

   for m:=0;m< len(balance);m++{
      ch <- balance[m]
        wg.Add(1)
   }
   for n:=0;n< len(balance);n++  {
      go func() {
      s := <- ch
        fmt.Println("s ",s)
      if s==4||s==7 {
         j++
      }
      defer wg.Done()
      }()
   }
    wg.Wait()
   fmt.Println("j ",j)
   fmt.Println("执行完毕")
}

Cada uno del valor del canal se echa en un wg.Add (1), entonces el valor de cada canal será consumido Defer wg.Done (), hasta que es 0, wg.Wait () no representa todo corrutina la operación de espera más.
j Así, en la superficie final será impresa es 2, el resultado es correcto, por supuesto, sólo una j sencilla ++ operaciones de negocio, donde cualquier lógica de servicio puede llenar.

Publicados 169 artículos originales · ganado elogios 224 · vistas 260 000 +

Supongo que te gusta

Origin blog.csdn.net/sureSand/article/details/86158066
Recomendado
Clasificación