Le package net de Go offre la possibilité de créer des serveurs d'écoute. Cependant, arrêter gracieusement ces serveurs peut être difficile en raison de la nature bloquante de la méthode Listen.Accept.
Une approche courante pour arrêter un serveur consiste à fermer le socket d'écoute. Cependant, cela peut entraîner des erreurs qui ne peuvent pas être distinguées des erreurs réelles lors de l'acceptation de la connexion. Par conséquent, l'extrait de code suivant présente ce problème :
// ... // Listen for incoming connections func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() // FIXME: I'd like to detect "use of closed network connection" here // FIXME: but it isn't exported from net if err != nil { log.Printf("Accept failed: %v", err) break } // ... } // ... }
Pour résoudre cette limitation, nous pouvons utiliser le canal es.done pour envoyer un signal avant que le serveur ne soit arrêté. Voici comment le code peut être amélioré :
// ... // Listen for incoming connections func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() if err != nil { select { case <-es.done: // Server is being stopped, so we can exit without logging the error. default: log.Printf("Accept failed: %v", err) } return } // ... } } // Stop the server by closing the listening socket func (es *EchoServer) stop() { es.done <- true es.listen.Close() }
En envoyant une valeur au canal es.done avant de fermer le socket d'écoute, la fonction serve peut déterminer quand le serveur est arrêté et se terminer gracieusement sans enregistrer de données parasites. erreurs.
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!