Inhaltsverzeichnis
Schnittstellenaufruf" >Schnittstellenaufruf
信号通知" >信号通知
总结" >总结
Heim Backend-Entwicklung Golang So implementieren Sie die Hot-Switch-Funktion des Go-Programms cooler

So implementieren Sie die Hot-Switch-Funktion des Go-Programms cooler

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

Während der Entwicklung benötigen wir häufig Thermoschalter, d. h. bestimmte Funktionen können zu geeigneten Zeiten ein- oder ausgeschaltet werden, während das Programm läuft. Beispielsweise ist die in der Leistungsanalyse verwendete pprof-Probenahme ein typischer Thermoschalter. In diesem Artikel wird erläutert, wie dieser Thermoschalter kühler wird.

Bevor wir die neue Lösung vorstellen, schauen wir uns an, wie pprof in Go-Programmen durchgeführt wird.

Schnittstellenaufruf

Leistungstests des Programms können sich auf seine Servicefunktionen auswirken. Daher wird die Online-Probenahme im Allgemeinen innerhalb eines festgelegten kleinen Zeitbereichs durchgeführt und erfordert eine effektive Schaltersteuerung.

Um dies zu erreichen, führen wir im Allgemeinen das Paket net/http/pprof (seine Init-Funktion ist an die Routing-Funktion gebunden) in den Code ein. Die Sampling-Funktion wird aktiviert, wenn von außen auf den HTTP-Dienst des angegebenen Ports zugegriffen wird. Nach Ablauf der Sampling-Zeit wird die Erfassung deaktiviert.

Der Implementierungscode lautet wie folgt

package main

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

func main() {
 go func() {
  _ = http.ListenAndServe(":8080", nil)
 }()
 ...
}
Nach dem Login kopieren

Mit diesem Ansatz gibt es natürlich kein Problem. Wir können es lernen und andere Switch-Funktionen in HTTP-Dienste umwandeln. Aber gibt es einen anderen cooleren Weg?

信号通知

信号处理与 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
   }
  }
 }()
}
Nach dem Login kopieren

在上述函数中,我们定义了接收信号通道<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))
 ...
}
Nach dem Login kopieren

在 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))
  }
 }()
}
Nach dem Login kopieren

总结

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

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Hot-Switch-Funktion des Go-Programms cooler. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So implementieren Sie die Hot-Switch-Funktion des Go-Programms cooler So implementieren Sie die Hot-Switch-Funktion des Go-Programms cooler Jul 21, 2023 pm 12:00 PM

Während der Entwicklung benötigen wir häufig Thermoschalter, d. h. bestimmte Funktionen können zu geeigneten Zeitpunkten während der Programmausführung ein- oder ausgeschaltet werden. Beispielsweise ist die in der Leistungsanalyse verwendete pprof-Probenahme ein typischer Thermoschalter. In diesem Artikel wird erläutert, wie dieser Thermoschalter kühler wird.

Verwenden Sie expvar, um Metriken für die Ausführung von Go-Programmen verfügbar zu machen Verwenden Sie expvar, um Metriken für die Ausführung von Go-Programmen verfügbar zu machen Jul 21, 2023 am 09:52 AM

Das Erhalten der Betriebsmetriken einer Anwendung kann uns ein besseres Verständnis darüber vermitteln, wie sie tatsächlich funktioniert. Durch die Anbindung dieser Indikatoren an Überwachungssysteme wie Prometheus und Zabbix können Anwendungen kontinuierlich erkannt und Auffälligkeiten zeitnah gewarnt und behoben werden.

Warum kann mein Go-Programm aufgrund fehlender Abhängigkeiten nicht kompiliert werden? Warum kann mein Go-Programm aufgrund fehlender Abhängigkeiten nicht kompiliert werden? Jun 10, 2023 pm 02:33 PM

Go ist eine beliebte Programmiersprache, die im Vergleich zu anderen Programmiersprachen schneller kompiliert werden kann und weniger Speicher verbraucht. Allerdings kann es vorkommen, dass unser Go-Programm aufgrund fehlender Abhängigkeiten nicht kompiliert werden kann. Warum passiert das? Zuerst müssen wir die Prinzipien der Go-Kompilierung verstehen. Go ist eine statisch kompilierte Sprache, was bedeutet, dass das Programm beim Kompilieren in Maschinencode übersetzt und dann direkt ausgeführt wird. Im Vergleich zu dynamisch kompilierten Sprachen ist der Kompilierungsprozess von Go komplizierter, da alle zu verwendenden Pakete vor der Kompilierung konvertiert werden müssen.

Warum verwendet mein Go-Programm die GoQUIC-Bibliothek nicht richtig? Warum verwendet mein Go-Programm die GoQUIC-Bibliothek nicht richtig? Jun 09, 2023 pm 04:55 PM

In letzter Zeit verwenden immer mehr Menschen GoQUIC zum Erstellen von Webanwendungen. Aufgrund seiner effizienten Übertragungsleistung und Zuverlässigkeit ist GoQUIC für viele Projekte zur ersten Wahl geworden. Während der tatsächlichen Verwendung stellten einige Entwickler jedoch fest, dass ihre Go-Programme die GoQUIC-Bibliothek nicht korrekt verwenden konnten. Lassen Sie uns als Nächstes die Gründe analysieren, die dazu führen können, dass Go-Programme die GoQUIC-Bibliothek nicht normal verwenden können. 1. Versionsprobleme Zunächst müssen Sie sicherstellen, dass Ihre GoQUIC-Version die neueste ist. GoQUIC wird regelmäßig aktualisiert, wenn

Das Go-Programm ist zu groß. Können wir eine verzögerte Initialisierung verwenden? Das Go-Programm ist zu groß. Können wir eine verzögerte Initialisierung verwenden? Aug 04, 2023 pm 05:23 PM

Im Zuge der kontinuierlichen Weiterentwicklung des Unternehmens handelte es sich anfangs meist um große Einheiten, und die Transformation verlief langsam. Ein Lager wird mehr als zehn Jahre lang genutzt, und die Größe des Lagers ist im Grunde ein Prozess der kontinuierlichen Vergrößerung.

Warum erhalte ich beim Ausführen meines Go-Programms die Fehlermeldung „Nicht genügend Arbeitsspeicher'? Warum erhalte ich beim Ausführen meines Go-Programms die Fehlermeldung „Nicht genügend Arbeitsspeicher'? Jun 09, 2023 pm 04:40 PM

Go ist eine effiziente Programmiersprache, die spezielle Mechanismen zur Speicherverwaltung bereitstellt. Allerdings können auch bei Verwendung dieser Sprache einige Probleme auftreten, wie z. B. „Outofmemory“-Fehler. Warum erhält mein Go-Programm diesen Fehler? Speicherverlust Speicherverlust ist ein häufiges Problem, das auch in der Go-Sprache auftritt. Speicherlecks treten auf, wenn Ihr Go-Programm eine große Menge Speicher zuweist und diesen nach der Ausführung bestimmter Vorgänge nicht vollständig freigibt. Wenn ein Speicherverlust auftritt

Warum funktioniert die Ausnahmebehandlung in meinem Go-Programm nicht? Warum funktioniert die Ausnahmebehandlung in meinem Go-Programm nicht? Jun 10, 2023 am 10:13 AM

Golang (Go) ist eine Sprache, die sehr gut mit Fehlern und Ausnahmen umgehen kann. Im Gegensatz zu anderen Sprachen behandelt Go Ausnahmen durch einen einfachen, aber effektiven Fehlerbehandlungsmechanismus. Obwohl der Fehlerbehandlungsmechanismus von Go sehr leistungsfähig und flexibel ist, haben einige Programmierer immer noch Probleme, die Fehlerbehandlung in ihren Programmen zu implementieren. Dieser Artikel soll bei der Beantwortung der Frage helfen, warum die Ausnahmebehandlung in Go-Programmen nicht funktioniert und wie man Ausnahmesituationen richtig behandelt. Eine ineffektive Ausnahmebehandlung in Go wird normalerweise dadurch verursacht, dass der Programmierer den Fehler nicht richtig behandelt oder einen Fehler macht

Warum erhält mein Go-Programm bei der Ausführung einen „Core Dumped'-Fehler? Warum erhält mein Go-Programm bei der Ausführung einen „Core Dumped'-Fehler? Jun 09, 2023 pm 05:49 PM

Bei der Entwicklung mit der Go-Sprache ist es unvermeidlich, dass Sie auf verschiedene Fehler stoßen. Einer der häufigsten Fehler ist „coredumped“, und diese Fehlermeldung kann für einige Entwickler verwirrend sein. In diesem Artikel wird die Ursache dieses Fehlers erläutert und wie er behoben werden kann. Die Bedeutung von „coredumped“ Im Linux-Betriebssystem ist „coredumped“ eine Fehlermeldung, die darauf hinweist, dass ein Prozess während der Ausführung unerwartet beendet wurde und eine sogenannte „Core“-Datei generiert wurde. Das

See all articles