Interrompendo a execução de uma rotina Go (*TCPListener) Aceitar
Ao criar um servidor TCP em Go, você pode encontrar o desafio de graciosamente desligando o servidor e interrompendo o tratamento da goroutine func (*TCPListener) Accept.
Em Go, func (*TCPListener) Accept bloqueia a execução até que uma conexão seja recebida. Para interromper esta goroutine, você deve:
Fechar o net.Listener:
A chave para interromper a goroutine Accept é fechar o net.Listener obtido da net. Ouvir(...). Ao fechar o listener, você sinaliza ao sistema operacional que nenhuma outra conexão será recebida, fazendo com que a goroutine Accept seja encerrada.
Retorno da goroutine:
Após fechar o ouvinte, garanta que sua goroutine retorne. Se a goroutine tiver código após a chamada Accept, ela continuará em execução e poderá causar comportamento não intencional ou erros.
Código de exemplo:
package main
import (
"fmt"
"net"
)
func main() {
ln, err := net.Listen("tcp", ":8080")
if err != nil {
// Handle error
}
go func() {
for {
conn, err := ln.Accept()
if err != nil {
if err == net.ErrClosed {
return // Listener was closed
}
// Handle other errors
}
// Handle connection
conn.Close()
}
}()
fmt.Println("Press enter to stop...")
var input string
fmt.Scanln(&input)
ln.Close() // Close the listener, interrupting the Accept loop
}
Este código cria um TCPListener na porta 8080 e inicia uma goroutine que lida com conexões de entrada em um loop infinito. Quando o usuário pressiona enter, o programa fecha o listener e interrompe a chamada de bloqueio Accept, fazendo com que a goroutine retorne.
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