Golang errgroup

Golang errgroup

El paquete Golang Errgroup se utiliza para proporcionar herramientas para la sincronización, la propagación de errores y la cancelación de contexto para un grupo de goroutinas que realizan una tarea común.

Echemos un vistazo a cómo usar el paquete errgroup.

Importar paquete requerido

Para usar el paquete errgroup, debe importarlo utilizando la cláusula de importación. El código de ejemplo a continuación muestra cómo importar el paquete errgroup.

importar "golang.org/x/sync/errgroup "

Con la función de contexto

El paquete errgroup nos proporciona la función withcontext. La función devuelve un nuevo grupo y el contexto asociado.

Si la función pasada devuelve un error no 0-niil o la espera regresa, el contexto se cancela.

GO FUNC

La segunda función proporcionada por el paquete errgroup es la función GO. Esta función llama a una función especificada a una nueva goroutine.

Si la primera llamada devuelve un error no NIL, esto cancela el contexto.

Esperar funciones

La tercera función es la función de espera. Esta función espera un bloque hasta que la función llame desde el método GO devuelve un valor.

Ejemplo

Veamos cómo podemos usar el paquete errgroup. Comencemos con un conjunto de rutinas GO que simplemente impriman un valor.

paquete principal
importar "fmt"
func Main ()
para i: = 0; i < 10; i++
ir fmt.Println ("Tarea de procesamiento:", i)

Aquí, tenemos un bucle for que simplemente ejecuta un montón de goroutinas e imprime el valor actual en la iteración de bucle.

Si ejecutamos el código anterior, nota que en realidad no imprime nada. Esto se debe a que las goroutinas están dentro de la función principal y una vez que termina la función principal, GO terminará todo el programa, ya sea que las Goroutinas hayan terminado o no.

Podemos resolver esto utilizando el paquete de sincronización de la biblioteca estándar. Consulte nuestro tutorial sobre Golang Sync para obtener más información.

https: // linuxhint.com/golang-sync/

Podemos redefinir el código anterior usando los grupos de espera como se muestra a continuación:

paquete principal
importar (
"FMT"
"Sincronización"
)
func Main ()
WG: = & Sync.WaitGroup
para i: = 0; i < 10; i++
WG.Agregar (1)
Go Func (Task Int)
diferir WG.Hecho()
fmt.Println ("Tarea de procesamiento:", tarea)
(i)

WG.Esperar()

Aquí, presentamos "concurrencia" usando grupos de espera. En pocas palabras, WaitGroup es un contador que nos permite bloquear la función principal de salir hasta que todas las Goroutinas hayan terminado de ejecutar.

El grupo de espera funciona creando un contador que mantiene el tracto del número de goroutinas en la que. Una vez que se completa una Goroutine, la eliminamos de la que. Una vez que el que es 0, el grupo de espera desbloquea la ejecución y regresa a.

Observe la función Agregar? Usamos esto para agregar un valor al contador de que WaitGroup que. Una vez que se realiza la ejecución, eliminamos la goroutina completa utilizando el método hecho.

Usando ERRGROUP

En el ejemplo anterior, procesamos un grupo de goroutinas utilizando el paquete de sincronización en GO. Sin embargo, no hay mecanismo para manejar ningún error. Aunque no es necesario para un ejemplo simple como uno que se muestra arriba, es importante para muchas aplicaciones.

Para eso, podemos usar la función errgroup que permite manejar errores en un grupo de espera. Echa un vistazo al ejemplo a continuación:

paquete principal
importar (
"FMT"
"registro"
"Matemáticas/Rand"
"Golang.org/x/sync/errgroup "
)
Error de tareas de tarea (tarea int)
Si Rand.Intn (10) == tarea
return fmt.ERRORF ("Tarea %v falló", tarea)

fmt.Printf ("tarea %v completado", tarea)
regresar nulo

func Main ()
por ejemplo: = & errgroup.Grupo
para i: = 0; i < 10; i++
Tarea: = i
p.ej.Error de Go (func ()
Tarea de retorno (tarea)
)

Si err: = eg.Esperar(); errar != nulo
registro.Fatal ("error", err)

fmt.Println ("completado con éxito!")

En este ejemplo, presentamos una función simple que genera un entero aleatorio. Si el valor aleatorio es igual a la tarea, devolvemos un error.

Luego usamos el grupo de error para manejar los errores utilizando el grupo y las funciones GO.

Clausura

Esta guía cubrió cómo introducir y trabajar con grupos de espera y manejar errores utilizando el paquete errgroup.