Maison >développement back-end >Golang >Comment puis-je arrêter progressivement un serveur Go et éviter les erreurs « Utilisation d'une connexion réseau fermée » ?

Comment puis-je arrêter progressivement un serveur Go et éviter les erreurs « Utilisation d'une connexion réseau fermée » ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-12 11:28:09337parcourir

How Can I Gracefully Stop a Go Server and Avoid

Gérer correctement l'arrêt du serveur dans Go

Introduction au problème

Dans Go, l'arrêt progressif d'un serveur en écoute est essentiel pour éviter une interruption brutale et une perte potentielle de données . L'un des défis consiste à discerner l'erreur spécifique qui indique que l'écouteur a été fermé, car elle n'est pas explicitement exportée dans la bibliothèque standard.

Approche de la solution

Pour résoudre ce problème, nous pouvons exploiter le canal terminé pour signaler l'arrêt imminent du serveur.

Logique du serveur améliorée

La fonction serve() modifiée gère désormais les erreurs différemment :

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))
  }
}
  • Le canal done nous permet d'envoyer un signal à la fonction serve() avant de fermer l'écouteur.
  • Lorsque stop() est appelé, il envoie un valeur à done, qui débloque l'instruction select dans serve().
  • Cela garantit que lorsque l'écouteur est fermé, la fonction serve() se termine gracieusement sans signaler "l'utilisation d'un réseau fermé connexion" erreur.

Méthode Stop mise à jour

La méthode stop() modifiée envoie désormais un signal au canal terminé avant de fermer l'écouteur :

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

Évaluation et conclusion

Cette approche offre une manière améliorée et gracieuse de gérer l'arrêt du serveur dans Go. En utilisant le canal terminé, nous pouvons empêcher l'affichage de messages d'erreur indésirables tout en gardant le contrôle sur la terminaison du serveur.

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