Maison  >  Article  >  développement back-end  >  Parlons de la méthode d'arrêt élégante dans Golang

Parlons de la méthode d'arrêt élégante dans Golang

PHPz
PHPzoriginal
2023-04-27 09:11:061202parcourir

Lors du développement et de l'utilisation de Golang, vous rencontrerez généralement des situations dans lesquelles vous devrez arrêter ou arrêter de fonctionner. Par exemple, si le programme se termine ou si une exception se produit, il doit être arrêté correctement.

Un arrêt progressif peut arrêter l'exécution du programme et en même temps permettre le traitement des tâches démarrées pour éviter des problèmes tels que la perte de données et la fuite de ressources, et n'entraînera pas de pertes inutiles pour le client. Cet article traite de la méthode d'arrêt gracieuse de Golang.

Méthode d'arrêt élégante

Dans Golang, il n'est pas difficile d'implémenter un arrêt progressif. Nous pouvons le faire en définissant un sémaphore ou un canal. La méthode d'implémentation spécifique est la suivante :

Réalisée via un sémaphore

package main

import (
    "log"
    "os"
    "os/signal"
    "syscall"
    "time"
)

func main() {
    stop := make(chan os.Signal, 1)
    signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)

    log.Println("Starting...")

    go func() {
        <-stop
        log.Println("Stopping...")

        // 处理关闭逻辑
        time.Sleep(3 * time.Second)

        log.Println("Graceful shutdown finished")
        os.Exit(0)
    }()

    // 处理业务逻辑
    for {
        log.Println("Running...")
        time.Sleep(1 * time.Second)
    }
}

Dans ce code. , pass make crée un canal tampon de signal de type os.Signal et de longueur 1, puis indique au système d'exploitation via la fonction Notify du package de signaux que les signaux que nous voulons surveiller sont SIGINT et SIGTERM, qui peuvent tous deux représenter le programme. . Fermez la demande.

Ensuite, nous avons démarré une goroutine et écouté le canal d'arrêt. Une fois le signal SIGINT ou SIGTERM reçu, l'exécution de la goroutine sera déclenchée. Pendant le processus d'exécution, nous traitons la logique d'arrêt. Time.Sleep est utilisé ici pour simuler une opération fastidieuse afin de mieux tester si notre programme se termine normalement. Enfin, le système d'exploitation est informé via la fonction os.Exit que la demande d'arrêt du programme a été traitée.

Dans la goroutine principale, nous traitons la logique métier et imprimons "Running..." chaque seconde. Voici juste un exemple simple : généralement, lorsque nous traitons la logique métier, nous devons enregistrer les données et libérer des ressources régulièrement. .

Réalisé via le canal

package main

import (
    "log"
    "os"
    "time"
)

func main() {
    done := make(chan bool)

    log.Println("Starting...")

    go func() {
        osSignals := make(chan os.Signal, 1)
        signal.Notify(osSignals, syscall.SIGINT, syscall.SIGTERM)

        select {
        case <-osSignals:
            log.Println("Stopping...")

            // 处理关闭逻辑
            time.Sleep(3 * time.Second)

            log.Println("Graceful shutdown finished")
            done <- true
        }
    }()

    // 处理业务逻辑
    for {
        log.Println("Running...")
        time.Sleep(1 * time.Second)
        select {
        case <-done:
            return // 正常退出
        default:
            continue
        }
    }
}

Dans ce code, nous créons une variable done de type booléen pour indiquer si notre programme est terminé, puis traitons la logique métier dans la goroutine principale, imprimons régulièrement "Running..." et Surveillance effectuée via la fonction de sélection. Si la variable done est définie sur true, le programme se termine et revient à la fonction principale pour terminer la sortie du programme.

Dans une autre goroutine, nous créons un canal tampon de signal de type os.Signal et de longueur 1 à make, puis indiquons au système d'exploitation via la fonction Notify du package de signaux que les signaux que nous voulons surveiller sont SIGINT et SIGTERM . Ensuite, écoutez osSignals via la fonction select Si un signal SIGINT ou SIGTERM est reçu, une opération spécifique sera déclenchée.

Signaux surveillés par le programme

Dans les systèmes Linux, il existe généralement les signaux suivants :

Normalement, nous n'avons besoin que d'écouter les signaux SIGINT et SIGTERM. Le rôle de l'arrêt progressifGrâce à l'arrêt progressif, nous pouvons éviter la perte de données, les fuites de ressources et d'autres problèmes causés par des requêtes et des opérations échouées. Ceci est particulièrement important pour les programmes et applications de longue durée qui fournissent des services. En particulier dans les systèmes distribués et les architectures de microservices, un arrêt progressif peut garantir efficacement la stabilité et les performances du système. S'il n'y a pas de fonction ciblée de gestion des problèmes, le programme peut se terminer arbitrairement ou déclencher un crash après avoir reçu un signal d'arrêt, provoquant de graves problèmes, voire une confusion. pertes inutiles pour le client. RésuméGrâce à cet article, nous avons appris comment utiliser le canal et les packages os/signal de Golang pour un arrêt progressif, et comment effectuer un arrêt progressif en écoutant les signaux. Dans le développement réel, l'arrêt normal d'une application est une tâche très importante. Un arrêt progressif peut améliorer efficacement la stabilité du programme et éviter des problèmes tels que le gaspillage de ressources et la perte de données.
Nom du signal Description du signal
SIGINT Caractère d'interruption du terminal, généralement émis via Control+C
SIGTERM Signal de fin, généralement utilisé pour demander au programme d'arrêter de s'exécuter tout seul
SIGHUP Signal de suspension, indique généralement qu'une connexion de terminal a été interrompue et que le fichier de configuration doit être re- lire, etc. être attrapé ou ignoré, ne peut qu'arrêter violemment le processus
SIGCONT Continuer à exécuter le processus
SIGPIPE signal de rupture de tuyau, signifie généralement que l'autre partie a fermé la connexion lors de la lecture des données
SIGALRM Signal de réveil, utilisé pour déclencher régulièrement une certaine alarme. Une opération
SIGCHLD Signal de fin de sous-processus

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!

Déclaration:
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