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()
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)
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!