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
Libérer: 2024-12-12 11:28:09
original
345 Les gens l'ont consulté

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))
  }
}
Copier après la connexion
  • 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
}
Copier après la connexion

É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!

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