Maison >développement back-end >Golang >Parlons de la méthode d'arrêt élégante dans Golang
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.
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 :
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. .
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.
Dans les systèmes Linux, il existe généralement les signaux suivants :
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 |
Normalement, nous n'avons besoin que d'écouter les signaux SIGINT et SIGTERM. | Le rôle de l'arrêt progressif |
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. |
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!