"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como desligar normalmente um servidor Go TCP e interromper a goroutine `(*TCPListener) Accept`?

Como desligar normalmente um servidor Go TCP e interromper a goroutine `(*TCPListener) Accept`?

Publicado em 2024-11-12
Navegar:869

How to Gracefully Shut Down a Go TCP Server and Interrupt the `(*TCPListener) Accept` Goroutine?

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.

Tutorial mais recente Mais>

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