Heim  >  Artikel  >  Backend-Entwicklung  >  Lassen Sie uns über die elegante Shutdown-Methode in Golang sprechen

Lassen Sie uns über die elegante Shutdown-Methode in Golang sprechen

PHPz
PHPzOriginal
2023-04-27 09:11:061202Durchsuche

Bei der Entwicklung und Verwendung von Golang werden Sie normalerweise auf Situationen stoßen, in denen Sie herunterfahren oder mit dem Laufen aufhören müssen. Wenn das Programm beispielsweise endet oder eine Ausnahme auftritt, muss es ordnungsgemäß heruntergefahren werden.

Ein ordnungsgemäßes Herunterfahren kann die Ausführung des Programms stoppen und gleichzeitig die Verarbeitung der gestarteten Aufgaben ermöglichen, um Probleme wie Datenverlust und Ressourcenverlust zu vermeiden, und verursacht keine unnötigen Verluste für den Client. In diesem Artikel wird die Methode zum ordnungsgemäßen Herunterfahren von Golang erläutert.

Elegante Shutdown-Methode

In Golang ist es nicht schwierig, ein elegantes Herunterfahren zu implementieren. Wir können dies tun, indem wir ein Semaphor oder einen Kanal festlegen. Die spezifische Implementierungsmethode ist wie folgt:

Wird durch ein Semaphor erreicht

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

In diesem Code Pass make erstellt einen Signalpufferkanal vom Typ os.Signal und der Länge 1 und teilt dem Betriebssystem dann über die Notify-Funktion im Signalpaket mit, dass die Signale, die wir überwachen möchten, SIGINT und SIGTERM sind, die beide das Programm darstellen können . Schließen Sie die Anfrage.

Als nächstes haben wir eine Goroutine gestartet und den Stoppkanal abgehört. Sobald das SIGINT- oder SIGTERM-Signal empfangen wird, wird die Ausführung der Goroutine ausgelöst. Während des Ausführungsprozesses verarbeiten wir die Shutdown-Logik Time.Sleep, um einen zeitaufwändigen Vorgang zu simulieren und so besser testen zu können, ob unser Programm normal endet. Abschließend wird das Betriebssystem über die Funktion os.Exit darüber informiert, dass die Anforderung zum Herunterfahren des Programms verarbeitet wurde.

In der Haupt-Goroutine verarbeiten wir die Geschäftslogik und geben jede Sekunde „Wird ausgeführt“ aus. Hier ist nur ein einfaches Beispiel: Wenn wir die Geschäftslogik verarbeiten, müssen wir regelmäßig Daten speichern und freigeben .

Durch den Kanal erreicht

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

In diesem Code erstellen wir eine fertige Variable vom Typ Bool, um anzuzeigen, ob unser Programm abgeschlossen wurde, und verarbeiten dann die Geschäftslogik in der Haupt-Goroutine, geben regelmäßig „Wird ausgeführt ...“ aus und Die Überwachung erfolgt über die Auswahlfunktion. Wenn die Variable done auf true gesetzt ist, endet das Programm und kehrt zur Hauptfunktion zurück, um den Programmausgang abzuschließen.

In einer anderen Goroutine erstellen wir einen Signalpufferkanal vom Typ os.Signal und der Länge 1 bis make und teilen dem Betriebssystem dann über die Notify-Funktion im Signalpaket mit, dass die Signale, die wir überwachen möchten, SIGINT und SIGTERM sind. Hören Sie sich als Nächstes osSignals über die Auswahlfunktion an. Wenn ein SIGINT- oder SIGTERM-Signal empfangen wird, wird ein bestimmter Vorgang ausgelöst. Vom Programm überwachte Signale

SIGTERM

Beendigungssignal, das normalerweise verwendet wird, um das Programm aufzufordern, die eigenständige Ausführung zu beendenSIGHUPHang-Signal, zeigt normalerweise an, dass eine Terminalverbindung unterbrochen wurde und die Konfigurationsdatei neu erstellt werden muss. lesen usw. SIGUSR1 -31Benutzerdefiniertes SignalSIGKILLProzesssignal beenden, kann nicht abgefangen oder ignoriert werden, kann den Prozess nur gewaltsam beendenSIGSTOPProzesssignal stoppen, nicht möglich Wenn es abgefangen oder ignoriert wird, kann der Prozess nur gewaltsam gestoppt werden Weckersignal, das zum regelmäßigen Auslösen eines bestimmten Alarms verwendet wird. Eine OperationEndsignal des UnterprozessesNormalerweise müssen wir nur auf die Signale SIGINT und SIGTERM hören. Die Rolle des ordnungsgemäßen HerunterfahrensDurch das ordnungsgemäße Herunterfahren können wir Datenverluste, Ressourcenlecks und andere Probleme vermeiden, die durch fehlgeschlagene Anforderungen und Vorgänge verursacht werden. Dies ist besonders wichtig für Programme und Anwendungen mit langer Laufzeit, die Dienste bereitstellen. Insbesondere in verteilten Systemen und Microservice-Architekturen kann ein ordnungsgemäßes Herunterfahren die Systemstabilität und -leistung effektiv gewährleisten. Wenn keine gezielte Problembehandlungsfunktion vorhanden ist, kann das Programm nach dem Empfang eines Stoppsignals willkürlich beendet werden, was zu ernsthaften Problemen und sogar zu Problemen führt unnötige Verluste für den Kunden. ZusammenfassungIn diesem Artikel haben wir gelernt, wie man Golangs Kanal- und Betriebssystem-/Signalpakete für ein ordnungsgemäßes Herunterfahren verwendet und wie man durch Abhören von Signalen ein ordnungsgemäßes Herunterfahren durchführt. In der tatsächlichen Entwicklung ist das normale Herunterfahren einer Anwendung eine sehr wichtige Aufgabe. Durch das ordnungsgemäße Herunterfahren kann die Stabilität des Programms effektiv verbessert und Probleme wie Ressourcenverschwendung und Datenverlust vermieden werden.
SIGALRM
SIGCHLD

Das obige ist der detaillierte Inhalt vonLassen Sie uns über die elegante Shutdown-Methode in Golang sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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