Comment gérez-vous les signaux dans une application Go?
La bonne façon de traiter les signaux dans les applications GO consiste à utiliser le package OS / Signal pour surveiller le signal et effectuer un arrêt élégant. 1. Utilisez Signal.Notify pour envoyer SIGINT, SIGTERM et d'autres signaux au canal; 2. Exécutez le service principal en goroutine et bloquez le signal d'attente; 3. Après avoir reçu le signal, effectuez un arrêt élégant avec le délai d'expiration via Context.withTimeout; 4. Nettoyer des ressources telles que la fermeture des connexions de la base de données et l'arrêt de la goroutine d'arrière-plan; 5. Utilisez le signal.Resine pour restaurer le comportement du signal par défaut lorsque cela est nécessaire pour vous assurer que le programme peut être terminé de manière fiable en Kubernetes et dans d'autres environnements.
La gestion des signaux dans une application Go est essentielle pour les fermetures gracieuses, le nettoyage et la réponse aux événements de niveau OS comme SIGTERM
, SIGINT
ou SIGHUP
. Go fournit un moyen propre et simple de travailler avec des signaux via le package os/signal
.

Voici comment vous gérez généralement les signaux en Go:
1. Utilisez signal.Notify
.
L'approche principale consiste à configurer un écouteur de signal à l'aide de signal.Notify
, qui envoie des signaux entrants à un canal. Cela se fait généralement dans un goroutine séparé afin qu'il ne bloque pas votre application principale.

package principal importer ( "contexte" "FMT" "enregistrer" "net / http" "OS" "OS / Signal" "Syscall" "temps" ) func main () { // Créer un serveur (exemple avec http) serveur: = & http.server {addr: ": 8080"} // Configuration du canal de signal STOP: = Make (Chan OS.Signal, 1) Signal.notify (stop, syscall.sigint, syscall.sigterm) // Démarrer le serveur dans un goroutine aller func () { Si err: = server.ListenandServe (); err! = nil && err! = http.errserverclosed { Log.fatalf ("Server échoué:% V", err) } } () fmt.println ("Le serveur fonctionne sur: 8080 ...") // Bloquer jusqu'à ce qu'un signal soit reçu <-stop fmt.println ("\ nshutdown signal reçu.") // Arrêtez gracieusement le serveur ctx, annuler: = context.withtimeout (context.background (), 10 * time.second) Déférer annuler () Si err: = server.shutdown (ctx); err! = Nil { Log.printf ("Erreur d'arrêt du serveur:% V", ERR) } fmt.println ("Le serveur s'est arrêté gracieusement.") }
2. Signaux communs à gérer
-
syscall.SIGINT
- déclenché par Ctrl C (interruption). -
syscall.SIGTERM
- Signal de terminaison gracieux (utilisé par des outils d'orchestration comme Kubernetes). -
syscall.SIGHUP
- souvent utilisé pour recharger la configuration (commune dans les démons).
Vous pouvez inclure plusieurs signaux dans signal.Notify
:
Signal.notify (stop, syscall.sigint, syscall.sigter, syscall.sighup)
3. Fermements gracieux meilleures pratiques
- Évitez
os.Exit()
Sauf si nécessaire - il saute le nettoyage. - Utilisez le contexte avec le délai d'expiration pour limiter la durée de l'arrêt.
- Ressources de fermeture: connexions de base de données, poignées de fichiers, écouteurs de réseau.
- Arrêtez les travailleurs de l'arrière-plan ou les Goroutines en utilisant l'annulation du contexte.
Exemple de nettoyage des tâches de fond:

ctx, annuler: = context.withcancel (context.background ()) // simule une tâche d'arrière-plan aller func () { Ticker: = Time.newTicker (2 * time.second) pour { sélectionner { cas <-ticker.c: fmt.println ("travail ...") cas <-ctx.done (): FMT.PRINTLN ("Le travailleur s'est arrêté.") Retour } } } () // plus tard, sur le signal: <-stop annuler () // arrêter le travailleur
4. N'oubliez pas de restaurer le comportement par défaut si nécessaire
Si vous construisez un démon de longue date ou si vous avez besoin d'arrêter temporairement d'écouter les signaux, vous pouvez utiliser signal.Reset()
:
déférer signal.reset (syscall.sigint, syscall.sigterm)
Cela restaure le comportement du signal par défaut après la sortie de votre programme.
La gestion des signaux garantit correctement que vos applications GO se comportent de manière prévisible dans les environnements de production - en particulier dans l'orchestration des conteneurs. Le motif est simple: écoutez sur un canal, bloquez jusqu'à ce qu'un signal arrive, puis nettoyez et sortez gracieusement.
Fondamentalement: configurez un canal, informez-le des signaux, attendez, puis fermez. Pas compliqué - mais facile à négliger.
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Goprovidesbuilt-insupportforhandlinlinenvironmentVariblesviattheoSpackage, permettant à développer laderadead, set et manageenvironmentDataseCurely et entièrement.

Utilisez GO Generics et Container / List pour réaliser le cache LRU en filetage; 2. Les composants principaux incluent des cartes, des listes liées bidirectionnelles et des verrous mutex; 3. Obtenir et ajouter les opérations assurer la sécurité de la concurrence à travers les verrous, avec une complexité temporelle d'O (1); 4. Lorsque le cache est plein, l'entrée inutilisée la plus longue sera automatiquement éliminée; 5. Dans l'exemple, le cache avec une capacité de 3 a réussi à éliminer le "B" le plus long inutilisé. Cette implémentation prend en charge entièrement générique, efficace et évolutif.

Quelle est la pièce OKB dans le répertoire? Qu'est-ce que cela a à voir avec la transaction OKX? OKB Currency Use Supply Moteur: Moteur stratégique de l'économie de jetons: Xlayer améliore l'OKB et la comparaison de la stratégie BNB Résumé de l'analyse des risques en août 2025, OKB OKB d'OKX Exchange a inauguré une augmentation historique. OKB a atteint un nouveau pic en 2025, en hausse de plus de 400% en seulement une semaine, perçant 250 $. Mais ce n'est pas une poussée accidentelle. Il reflète le changement réfléchi de l'équipe OKX dans le modèle de jeton et la stratégie à long terme. Qu'est-ce que OKB Coin? Qu'est-ce que cela a à voir avec la transaction OKX? OKB est OK Blockchain Foundation et

Utilisez la bibliothèque GoFeed pour analyser facilement RSS et AtomFeed. Tout d'abord, installez la bibliothèque via gogetgithub.com/mmcdole/gofeed, puis créez une instance d'analyseur et appelez la méthode Parseurl ou Parsestring pour analyser les flux distants ou locaux. La bibliothèque reconnaîtra automatiquement le format et renverra une structure d'alimentation unifiée. Ensuite, itérez les items feed.items pour obtenir des champs standardisés tels que le titre, le lien et le temps de publication. Il est également recommandé de définir les délais d'attente du client HTTP, de gérer les erreurs d'analyse et d'utiliser les performances d'optimisation du cache pour finalement obtenir une résolution de flux simple, efficace et fiable.

Tohandlepanicsingoroutines, a utilisé avec cocoverités de manière

GOTYPICAL OFFERSBETTERRUNTIMEPERFORMANCE AVEC LA MAINTRÉE DE PUTHROUGHTANDLOWERLATENCE, ENTERTFORI / O-HEAVYSERVICES, DUETOITSLIGHT LONDEGOROUTINESANDERFICENTSCHEDULL

Dans GO, la définition et l'appel des fonctions utilisent le mot-clé FUNC et la syntaxe fixe suivante, clarifiez d'abord la réponse: la définition de la fonction doit inclure le nom, le type de paramètre, le type de retour et le corps de la fonction, et passer dans des paramètres correspondants lors de l'appel; 1. Utilisez FuncFunctionName (params) returnType {} Syntaxe lors de la définition des fonctions, telles que funcadd (a, bint) int {return b}; 2. Prise en charge de plusieurs valeurs de retour, telles que FuncDivide (A, Bfloat64) (Float64, bool) {}; 3. Les fonctions d'appel utilisent directement le nom de la fonction avec des supports pour transmettre des paramètres, tels que le résultat: = add (3,5); 4. Plusieurs valeurs de retour peuvent être reçues par des variables ou

Pour commencer à construire des applications de blockchain en utilisant GO, vous devez d'abord maîtriser les concepts principaux de la blockchain, 1. Comprendre les blocs, le hachage, l'immuabilité, le mécanisme de consensus, le réseau P2P et les signatures numériques; 2. Installez GO et initialisez les projets et utilisez des modules GO pour gérer les dépendances; 3. Construisez une blockchain simple pour apprendre les principes en définissant la structure du bloc, en mettant en œuvre le hachage SHA-256, en créant des tranches de blockchain, en générant de nouveaux blocs et une logique de vérification; 4. Utilisez des cadres et des bibliothèques matures telles que Cosmossdk, Tendermintcore, Go-éthereum ou Badger dans le développement réel pour éviter les roues en double; 5. Utilisez GOROUTINE et GO-NET / HTTP ou Gorilla / Websocke dans le développement réel; 5. Utilisez GOroutine et Net / HTTP ou Gorilla / Websocke
