"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment arrêter progressivement un serveur Go TCP et interrompre la goroutine « (*TCPListener) Accepter » ?

Comment arrêter progressivement un serveur Go TCP et interrompre la goroutine « (*TCPListener) Accepter » ?

Publié le 2024-11-12
Parcourir:478

How to Gracefully Shut Down a Go TCP Server and Interrupt the `(*TCPListener) Accept` Goroutine?

Interruption de l'exécution d'une routine Go (*TCPListener) Accepter

Lors de la création d'un serveur TCP dans Go, vous pouvez rencontrer le défi de gracieusement arrêter le serveur et interrompre la fonction de gestion des goroutines (*TCPListener) Accepter.

Dans Go, func (*TCPListener) Accepter bloque l'exécution jusqu'à ce qu'une connexion soit reçue. Pour interrompre cette goroutine, vous devez :

Fermer le net.Listener :

La clé pour interrompre la goroutine Accepter est de fermer le net.Listener obtenu à partir du net. Écouter(...). En fermant l'écouteur, vous signalez au système d'exploitation qu'aucune connexion ne sera reçue, provoquant la fermeture de la goroutine Accepter.

Retour de la goroutine :

Après la fermeture l'auditeur, assurez-vous que votre goroutine revienne. Si la goroutine a du code après l'appel Accept, elle continuera à s'exécuter et peut provoquer un comportement ou des erreurs involontaires.

Exemple de code :

package main

import (
    "fmt"
    "net"
)

func main() {
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        // Handle error
    }

    go func() {
        for {
            conn, err := ln.Accept()
            if err != nil {
                if err == net.ErrClosed {
                    return // Listener was closed
                }
                // Handle other errors
            }
            // Handle connection
            conn.Close()
        }
    }()

    fmt.Println("Press enter to stop...")
    var input string
    fmt.Scanln(&input)

    ln.Close() // Close the listener, interrupting the Accept loop
}

Ce code crée un TCPListener sur le port 8080 et lance une goroutine qui gère les connexions entrantes dans une boucle infinie. Lorsque l'utilisateur appuie sur Entrée, le programme ferme l'écouteur et interrompt l'appel bloquant Accept, provoquant le retour de la goroutine.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3