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!