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

Comment puis-je arrêter gracieusement un serveur d'écoute Go sans erreurs parasites ?

Linda Hamilton
Libérer: 2024-12-12 18:59:10
original
903 Les gens l'ont consulté

How Can I Gracefully Stop a Go Listening Server Without Spurious Errors?

Arrêter gracieusement un serveur d'écoute dans Go

Contexte

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.

Approche existante

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
    }
    // ...
  }
  // ...
}
Copier après la connexion

Approche améliorée

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

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!

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