Go offre une gamme de mécanismes pour que la goroutine principale continue de fonctionner indéfiniment sans consommer de puissance de traitement . Considérez ces stratégies :
Sélection sans cas : le blocage permanent sans consommation de processeur est réalisable via une instruction select sans cas ni clause par défaut :
select {}
Réception depuis un canal vide : La goroutine principale peut être suspendue indéfiniment en recevant continuellement d'un canal vide :
<-make(chan int)
Réception d'un canal nul : De même, recevoir d'un canal nul produit le même effet :
<-chan int(nil)
Envoi vers un canal nul : Envoi à un canal nul suspend également définitivement le goroutine principal :
(chan int)(nil) <- 0
Verrouillage d'un mutex pré-verrouillé : Le verrouillage d'un mutex déjà verrouillé bloque efficacement le goroutine principal :
mu := sync.Mutex{} mu.Lock() mu.Lock()
Pour faciliter une sortie en douceur, un canal de sortie dédié peut être utilisé. Lorsqu'il est nécessaire de terminer le programme, ce canal est fermé :
var quit = make(chan struct{}) func main() { defer close(quit) // Application code... <-quit }
Dans une goroutine séparée, la fermeture du canal de sortie déclenche la sortie de la goroutine principale :
close(quit)
Si l'objectif est d'empêcher la goroutine principale de se terminer sans la bloquer, la fonction time.Sleep() peut être employé avec une durée suffisamment longue, plafonnée à environ 292 ans :
time.Sleep(time.Duration(1<<63 - 1))
Pour des durées prolongées, envisagez une boucle sans fin intégrant le temps ci-dessus.Sleep() :
for { time.Sleep(time.Duration(1<<63 - 1)) }
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!