Sinalizando Goroutines para Terminar
No Go, lidar com o encerramento de goroutines pode ser crucial para garantir o encerramento normal do aplicativo ou gerenciar a alocação de recursos. Este artigo explora uma técnica para sinalizar uma goroutine em execução para interromper sua execução.
O exemplo fornecido na consulta demonstra uma goroutine que faz loops infinitos, simulando processamento contínuo. O objetivo é encerrar esta goroutine se ela exceder um tempo limite especificado.
Uma abordagem inicial envolve o uso de dois canais: um para comunicação e outro para sinalização de encerramento. No entanto, a leitura do canal de sinalização bloquearia a goroutine, anulando sua finalidade pretendida.
Usando um canal de parada adicional
Uma solução eficaz é introduzir um canal de parada adicional , tooLate, do tipo chan struct{}. Dentro da goroutine, uma instrução select é usada para monitorar o canal de comunicação e o canal de parada. Se o canal tooLate receber um valor, a goroutine retorna normalmente, encerrando seu loop de processamento.
Aqui está o trecho de código modificado:
func main() {
// tooLate channel to signal goroutine to stop
tooLate := make(chan struct{})
proCh := make(chan string)
go func() {
for {
fmt.Println("working")
time.Sleep(1 * time.Second)
select {
case Nesta solução, o canal proCh continua a ser usado para comunicação, enquanto o canal tooLate serve como sinal para terminação. Quando o canal tooLate é fechado, a goroutine detecta isso e sai do loop.
Outras considerações
Além de usar um canal adicional, existem abordagens alternativas para sinalizar goroutines, como usar o tipo sync.Cond integrado para um controle mais refinado sobre a sincronização de goroutines. A escolha da técnica depende dos requisitos específicos da sua aplicação.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3