Heim >Backend-Entwicklung >Golang >Wie kann ich die Haupt-Goroutine in Go auf unbestimmte Zeit laufen lassen?

Wie kann ich die Haupt-Goroutine in Go auf unbestimmte Zeit laufen lassen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-17 21:25:10300Durchsuche

How Can I Keep the Main Goroutine Running Indefinitely in Go?

Verlängern der Existenz der Haupt-Goroutine in Go

Eternal Slumber

Go bietet eine Reihe von Mechanismen, um die Haupt-Goroutine auf unbestimmte Zeit laufen zu lassen, ohne Rechenleistung zu verbrauchen . Betrachten Sie diese Strategien:

  • Auswählen ohne Fälle: Eine dauerhafte Blockierung ohne CPU-Verbrauch ist durch eine SELECT-Anweisung ohne Fälle oder Standardklausel erreichbar:

    select {}
  • Empfangen von einem leeren Kanal: Die Haupt-Goroutine kann ausgesetzt werden auf unbestimmte Zeit durch kontinuierliches Empfangen von einem leeren Kanal:

    <-make(chan int)
  • Empfangen von einem Null-Kanal: Ebenso führt das Empfangen von einem Null-Kanal zum gleichen Effekt:

    <-chan int(nil)
  • Senden an einen Nil-Kanal: Durch das Senden an einen Null-Kanal wird auch die Haupt-Goroutine dauerhaft angehalten:

    (chan int)(nil) <- 0
  • Sperren eines vorgesperrten Mutex: Durch das Sperren eines bereits gesperrten Mutex wird die Haupt-Goroutine effektiv angehalten :

    mu := sync.Mutex{}
    mu.Lock()
    mu.Lock()

Kontrolliert Ausstieg

Um einen reibungslosen Ausstieg zu ermöglichen, kann ein dedizierter Beendigungskanal genutzt werden. Wenn die Notwendigkeit besteht, das Programm zu beenden, wird dieser Kanal geschlossen:

var quit = make(chan struct{})

func main() {
    defer close(quit)
    // Application code...
    <-quit
}

In einer separaten Goroutine löst das Schließen des Beendigungskanals das Beenden der Haupt-Goroutine aus:

close(quit)

Ruhe ohne Blockierung

Wenn das Ziel darin besteht, zu verhindern, dass die Haupt-Goroutine beendet wird, ohne sie zu blockieren, kann die Funktion time.Sleep() mit einem ausreichenden Aufwand verwendet werden große Dauer, begrenzt auf etwa 292 Jahre:

time.Sleep(time.Duration(1<<63 - 1))

Für längere Dauern sollten Sie eine Endlosschleife in Betracht ziehen, die die oben genannte Zeit einschließt.Sleep():

for {
    time.Sleep(time.Duration(1<<63 - 1))
}

Das obige ist der detaillierte Inhalt vonWie kann ich die Haupt-Goroutine in Go auf unbestimmte Zeit laufen lassen?. 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