Table des matières
Appel d'interface" >Appel d'interface
信号通知" >信号通知
总结" >总结
Maison développement back-end Golang Comment implémenter la fonction hot switch du programme Go de manière plus cool

Comment implémenter la fonction hot switch du programme Go de manière plus cool

Jul 21, 2023 pm 12:00 PM
go程序

Pendant le développement, nous avons souvent besoin d'interrupteurs thermiques, c'est-à-dire que des fonctions spécifiques peuvent être activées ou désactivées à des moments appropriés pendant l'exécution du programme. Par exemple, l'échantillonnage pprof utilisé dans l'analyse des performances est un interrupteur thermique typique. Cet article explique comment rendre cet interrupteur thermique plus froid.

Avant de présenter la nouvelle solution, passons en revue comment pprof est réalisé dans les programmes Go.

Appel d'interface

L'échantillonnage des performances du programme peut affecter ses capacités de service. Par conséquent, l’échantillonnage en ligne est généralement effectué dans une courte plage de temps spécifiée et nécessite un contrôle efficace des commutateurs.

Pour ce faire, nous introduisons généralement le package net/http/pprof (sa fonction init est liée à la fonction de fonction de routage) dans le code. La fonction d'échantillonnage est activée lors d'un accès externe au service HTTP du port spécifié. Une fois la période d'échantillonnage terminée, la collecte est désactivée.

Le code d'implémentation est le suivant

package main

import (
 "net/http"
 _ "net/http/pprof"
)

func main() {
 go func() {
  _ = http.ListenAndServe(":8080", nil)
 }()
 ...
}
Copier après la connexion

Il n'y a bien sûr aucun problème avec cette approche. Nous pouvons l'apprendre et transformer d'autres fonctions de commutation en services HTTP. Mais existe-t-il un autre moyen plus cool ?

信号通知

信号处理与 Go 程序的优雅退出一文中,我们谈论过信号机制,它用以向应用程序发送某种事件通知。

我们可以将基于接口触发的方式改为信号通知。

首先,构造采样功能函数(对应于 net/http/pprof 包下 init 函数中绑定的路由功能函数)。

func RegisterSignalForProfiling(sig os.Signal) {
 ch := make(chan os.Signal)
 started := false
 signal.Notify(ch, sig)

 go func() {
  var memoryProfile, cpuProfile, traceProfile *os.File
  for range ch {
   if started {
    pprof.StopCPUProfile()
    trace.Stop()
    pprof.WriteHeapProfile(memoryProfile)
    memoryProfile.Close()
    cpuProfile.Close()
    traceProfile.Close()
    started = false
   } else {
    cpuProfile, _ = os.Create("cpu.pprof")
    memoryProfile, _ = os.Create("memory.pprof")
    traceProfile, _ = os.Create("runtime.trace")
    pprof.StartCPUProfile(cpuProfile)
    trace.Start(traceProfile)
    started = true
   }
  }
 }()
}
Copier après la connexion

在上述函数中,我们定义了接收信号通道<span style="font-size: 15px;">ch</span>,通过<span style="font-size: 15px;">signal.Notify(ch, sig)</span>将指定的通知信号<span style="font-size: 15px;">sig</span><span style="font-size: 15px;">ch</span>进行绑定。<span style="font-size: 15px;">for range ch</span> 将阻塞等待外部信号<span style="font-size: 15px;">sig</span>,随着<span style="font-size: 15px;">sig</span>信号的到来,交替进入开启或关闭采样的逻辑。

<span style="font-size: 15px;">main</span>函数中,就可以这样替代<span style="font-size: 15px;">http.ListenAndServe(":8080", nil)</span>了。

package main

import (
  "syscall"
  ...
)

func main() {
  RegisterSignalForProfiling(syscall.Signal(31))
 ...
}
Copier après la connexion

在 linux 系统,可以通过<span style="font-size: 15px;">kill -signal_number pid</span>命令向程序发送指定信号。

如上代码所示,我们硬编码指定的采样开关信号值是 31。因此,当程序运行起来后,我们在控制台输入<span style="font-size: 15px;">kill -31 pid</span> 命令,即可开启采样,再次输入<span style="font-size: 15px;">kill -31 pid</span>命令,就关闭了采样。

依葫芦画瓢,我们再来一个打印 goroutine 堆栈信息的热开关函数,是不是很酷?

func RegisterSignalForPrintStack(sig os.Signal) {
 ch := make(chan os.Signal)
 signal.Notify(ch, sig)

 go func() {
  for range ch {
   buffer := make([]byte, 1024*1024*4)
   runtime.Stack(buffer, true)
   fmt.Println(string(buffer))
  }
 }()
}
Copier après la connexion

总结

热开关是一个很简单常用的功能,无非是选择何种触发与等待方式。基于接口的调用更适合于远程控制,基于信号则便于本地控制。

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 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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Comment implémenter la fonction hot switch du programme Go de manière plus cool Comment implémenter la fonction hot switch du programme Go de manière plus cool Jul 21, 2023 pm 12:00 PM

Au cours du développement, nous avons souvent besoin de commutateurs thermiques, c'est-à-dire que des fonctions spécifiques peuvent être activées ou désactivées à des moments appropriés pendant l'exécution du programme. Par exemple, l'échantillonnage pprof utilisé dans l'analyse des performances est un interrupteur thermique typique. Cet article explique comment rendre cet interrupteur thermique plus froid.

Utilisez expvar pour exposer les métriques en cours d'exécution du programme Go Utilisez expvar pour exposer les métriques en cours d'exécution du programme Go Jul 21, 2023 am 09:52 AM

L'obtention des métriques d'exécution d'une application peut nous permettre de mieux comprendre son fonctionnement réel. En connectant ces indicateurs à des systèmes de surveillance tels que prometheus et zabbix, les applications peuvent être détectées en continu et les anomalies peuvent être alertées et traitées en temps opportun.

Pourquoi mon programme Go ne parvient-il pas à se compiler en raison de dépendances manquantes ? Pourquoi mon programme Go ne parvient-il pas à se compiler en raison de dépendances manquantes ? Jun 10, 2023 pm 02:33 PM

Go est un langage de programmation populaire qui se compile plus rapidement et consomme moins de mémoire que les autres langages de programmation. Cependant, parfois, notre programme Go ne parvient pas à se compiler en raison de dépendances manquantes. Alors pourquoi cela arrive-t-il ? Tout d’abord, nous devons comprendre les principes de la compilation Go. Go est un langage compilé de manière statique, ce qui signifie que le programme est traduit en code machine lors de la compilation puis exécuté directement. Comparé aux langages compilés dynamiquement, le processus de compilation de Go est plus compliqué car tous les packages à utiliser doivent être convertis avant la compilation.

Pourquoi mon programme Go n'utilise-t-il pas correctement la bibliothèque GoQUIC ? Pourquoi mon programme Go n'utilise-t-il pas correctement la bibliothèque GoQUIC ? Jun 09, 2023 pm 04:55 PM

Récemment, de plus en plus de personnes ont commencé à utiliser GoQUIC pour créer des applications Web. En raison de ses performances de transmission efficaces et de sa fiabilité, GoQUIC est devenu le premier choix pour de nombreux projets. Cependant, lors de l'utilisation réelle, certains développeurs ont constaté que leurs programmes Go ne pouvaient pas utiliser correctement la bibliothèque GoQUIC. Analysons ensuite les raisons qui peuvent empêcher les programmes Go d'utiliser normalement la bibliothèque GoQUIC. 1. Problème de version Tout d'abord, vous devez vous assurer que votre version de GoQUIC est la dernière. GoQUIC est mis à jour fréquemment si

Le programme Go est trop volumineux. Pouvons-nous utiliser une initialisation paresseuse ? Le programme Go est trop volumineux. Pouvons-nous utiliser une initialisation paresseuse ? Aug 04, 2023 pm 05:23 PM

Dans le développement continu de l'entreprise, la plupart d'entre eux étaient au début de grandes unités, et la transformation a été lente. Un entrepôt sera utilisé pendant plus de dix ans, et l'échelle de l'entrepôt est essentiellement un processus d'augmentation continue.

Pourquoi la gestion des exceptions dans mon programme Go ne fonctionne-t-elle pas ? Pourquoi la gestion des exceptions dans mon programme Go ne fonctionne-t-elle pas ? Jun 10, 2023 am 10:13 AM

Golang (Go) est un langage très efficace pour gérer les erreurs et les exceptions. Contrairement à d'autres langages, Go gère les exceptions via un mécanisme de gestion des erreurs simple mais efficace. Bien que le mécanisme de gestion des erreurs de Go soit très puissant et flexible, certains programmeurs ont encore du mal à implémenter la gestion des erreurs dans leurs programmes. Cet article est destiné à répondre à la question de savoir pourquoi la gestion des exceptions dans les programmes Go ne fonctionne pas et comment gérer correctement les situations d'exception. La gestion inefficace des exceptions dans Go est généralement due au fait que le programmeur ne gère pas correctement l'erreur ou fait une erreur.

Pourquoi est-ce que j'obtiens des erreurs « mémoire insuffisante » lors de l'exécution de mon programme Go ? Pourquoi est-ce que j'obtiens des erreurs « mémoire insuffisante » lors de l'exécution de mon programme Go ? Jun 09, 2023 pm 04:40 PM

Go est un langage de programmation efficace qui fournit des mécanismes spéciaux pour la gestion de la mémoire. Cependant, même en utilisant ce langage, certains problèmes peuvent survenir, tels que des erreurs de « mémoire insuffisante ». Alors pourquoi mon programme Go obtient-il cette erreur ? Fuite de mémoire La fuite de mémoire est un problème courant, qui existe également dans le langage Go. Les fuites de mémoire se produisent lorsque votre programme Go alloue une grande quantité de mémoire et ne la libère pas complètement après avoir effectué certaines opérations. Si une fuite de mémoire se produit

Pourquoi mon programme Go obtient-il une erreur « core dumped » lors de l'exécution ? Pourquoi mon programme Go obtient-il une erreur « core dumped » lors de l'exécution ? Jun 09, 2023 pm 05:49 PM

Lors du processus de développement à l’aide du langage Go, il est inévitable que vous rencontriez diverses erreurs. L'une des erreurs courantes est "coredumped", et ce message d'erreur peut prêter à confusion pour certains développeurs. Cet article explique la cause de cette erreur et comment la corriger. Signification de "coredumped" Dans le système d'exploitation Linux, "coredumped" est un message d'erreur qui indique qu'un processus s'est arrêté de manière inattendue pendant l'exécution et qu'un fichier dit "core" a été généré. ce

See all articles