Maison > développement back-end > Golang > Comment arrêter gracieusement un serveur d'écoute Go sans erreurs ?

Comment arrêter gracieusement un serveur d'écoute Go sans erreurs ?

Susan Sarandon
Libérer: 2024-12-10 00:26:11
original
691 Les gens l'ont consulté

How to Gracefully Stop a Go Listening Server Without Errors?

Comment arrêter gracieusement un serveur d'écoute dans Go

Dans Go, la fonction Listen.Accept bloque l'exécution jusqu'à ce qu'une connexion soit acceptée. Cela rend difficile l'arrêt progressif d'un serveur en écoute, car vous ne pouvez pas faire la différence entre une erreur et une connexion fermée.

Une solution consiste à utiliser un canal terminé pour signaler quand le serveur doit arrêter d'écouter. Cela vous permet de fermer le socket d'écoute sans obtenir d'erreur.

Voici un exemple de la façon de procéder :

// Echo server struct
type EchoServer struct {
    listen net.Listener
    done   chan bool
}

// Listen for incoming connections
func (es *EchoServer) serve() {
    for {
        conn, err := es.listen.Accept()
        if err != nil {
            select {
            case <-es.done:
                // If we called stop() then there will be a value in es.done, so
                // we'll get here and we can exit without showing the error.
            default:
                log.Printf("Accept failed: %v", err)
            }
            return
        }
        go es.respond(conn.(*net.TCPConn))
    }
}

// Stop the server by closing the listening listen
func (es *EchoServer) stop() {
    es.done <- true   // We can advance past this because we gave it buffer of 1
    es.listen.Close() // Now it the Accept will have an error above
}
Copier après la connexion

Ce code utilise un canal terminé pour signaler quand le serveur doit arrête d'écouter. Lorsque la méthode stop est appelée, elle envoie une valeur au canal terminé, ce qui entraîne la fermeture de la méthode serve.

Cela vous permet d'arrêter gracieusement un serveur en écoute sans obtenir d'erreur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal