Golang ErrGroup

Golang ErrGroup

O pacote Golang ErrGroup é usado para fornecer ferramentas para sincronização, propagação de erros e cancelamento de contexto para um grupo de goroutinos que executam uma tarefa comum.

Vamos dar uma olhada em um pacote de como usar o ErrGroup.

Importar pacote necessário

Para usar o pacote ErrGroup, você precisa importá -lo usando a cláusula de importação. O código de exemplo abaixo mostra como importar o pacote ErrGroup.

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

WithContext Função

O pacote ErrGroup nos fornece a função WithContext. A função retorna um novo grupo e o contexto associado.

Se a função passada retornar um erro não-0-nil ou o retorno de espera, o contexto será cancelado.

Vá func

A segunda função fornecida pelo pacote ErrGroup é a função Go. Esta função chama uma função especificada para uma nova goroutina.

Se a primeira chamada retornar um erro não-nil, isso cancela o contexto.

Espere func

A terceira função é a função de espera. Esta função espera um bloco até que a função chama do método Go retornar um valor.

Exemplo

Vamos ver como podemos usar o pacote ErrGroup. Vamos começar com um conjunto de rotinas que simplesmente imprimem um valor.

Pacote principal
importar "fmt"
func main ()
para i: = 0; eu < 10; i++
vá fmt.Println ("Tarefa de processamento:", i)

Aqui, temos um loop que simplesmente executa um monte de goroutinas e imprimir o valor atual na iteração do loop.

Se executarmos o código acima, você percebe que ele realmente não impede nada. Isso ocorre porque os Goroutines estão dentro da função principal e, uma vez que a função principal termina, o GO encerrará todo o programa, independentemente de as goroutinas terminam ou não.

Podemos resolver isso usando o pacote de sincronização da biblioteca padrão. Verifique nosso tutorial sobre Golang Sync para saber mais.

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

Podemos redefinir o código acima usando grupos de espera como mostrado abaixo:

Pacote principal
importação (
"FMT"
"sincronizar"
)
func main ()
WG: = & SYNC.Grupo de espera
para i: = 0; eu < 10; i++
WG.Adicionar (1)
vá func (tarefa int)
adiar wg.Feito()
fmt.Println ("Tarefa de processamento:", tarefa)
(eu)

WG.Espere()

Aqui, apresentamos a "concorrência" usando grupos de espera. Em poucas palavras, o grupo de espera é um balcão que nos permite bloquear a função principal de sair até que todas as goroutinas terminem de executar.

O grupo de espera funciona criando um balcão que mantém o trato do número de goroutinas no que. Depois que uma goroutina é concluída, removemos -a do que. Uma vez que o que.

Observe a função Adicionar? Usamos isso para agregar um valor ao balcão do grupo de espera. Depois que a execução é feita, removemos a goroutina concluída usando o método feito.

Usando errGroup

No exemplo acima, processamos um grupo de goroutines usando o pacote de sincronização em Go. No entanto, não há mecanismo para lidar com nenhum erro. Embora não seja necessário para um exemplo simples como mostrado acima, é importante para muitas aplicações.

Para isso, podemos usar a função ErrGroup, que permite lidar com erros em um grupo de espera. Dê uma olhada no exemplo abaixo:

Pacote principal
importação (
"FMT"
"registro"
"Matemática/rand"
"Golang.org/x/sync/errgroup "
)
FUNC TASK (TASK INT) ERRO
Se Rand.Intn (10) == tarefa
Retornar FMT.Errorf ("Task %V falhou", tarefa)

fmt.Printf ("Task %v concluído", tarefa)
retornar nil

func main ()
por exemplo: = & errGroup.Grupo
para i: = 0; eu < 10; i++
tarefa: = eu
por exemplo.Vá (func () erro
Tarefa de retorno (tarefa)
)

se err: = por exemplo.Espere(); errar != nil
registro.Fatal ("Erro", Err)

fmt.Println ("Concluído com sucesso!")

Neste exemplo, introduzimos uma função simples que gera um número inteiro aleatório. Se o valor aleatório for igual à tarefa, retornamos um erro.

Em seguida, usamos o grupo de erros para lidar com os erros usando o grupo e funções Go.

Fechamento

Este guia abordou como introduzir e trabalhar com grupos de espera e lidar com erros usando o pacote ErrGroup.