Maison > développement back-end > Golang > 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 » ?

Patricia Arquette
Libérer: 2024-11-03 07:27:02
original
809 Les gens l'ont consulté

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 réseau.Écouteur :

La clé pour interrompre la goroutine Accepter est de fermer le réseau.Listener obtenu à partir du réseau. Écouter(...). En fermant l'écouteur, vous signalez au système d'exploitation qu'aucune connexion ne sera reçue, provoquant la sortie 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 :

<code class="go">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
}</code>
Copier après la connexion

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 Accepter, provoquant le retour de la goroutine.

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