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
Susan Sarandonoriginal
2024-12-10 00:26:11690parcourir

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
}

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!

Déclaration:
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