Attente temporisée pour WaitGroup.Wait()
Dans Go, le type WaitGroup est utilisé pour synchroniser plusieurs goroutines jusqu'à ce que tous aient terminé leurs tâches . La méthode WaitGroup.Wait() se bloque jusqu'à ce que tous les membres du groupe aient signalé leur achèvement ou que le contexte soit annulé.
Cependant, il est parfois souhaitable d'imposer un timeout à l'opération d'attente WaitGroup, pour empêcher le planificateur d'attendre indéfiniment un travailleur errant. Cela ouvre des questions philosophiques sur la fiabilité et la récupérabilité du système en présence de telles erreurs, mais cette discussion dépasse le cadre de cette question.
Solution
La solution fournie utilise un canal et une instruction select pour obtenir la fonctionnalité de délai d'attente :
c := make(chan struct{}) go func() { defer wg.Done() // Do the work c <- struct{}{} }() select { case <-c: // Work completed case <-time.After(timeout): // Timed out }
Cette solution est efficace, mais elle peut sembler trop alambiqué. Les conseils suivants peuvent l'améliorer :
Fonction d'assistance
Pour simplifier le processus, une fonction d'assistance peut être créée pour encapsuler la logique de délai d'attente :
func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool { c := make(chan struct{}) go func() { defer close(c) wg.Wait() }() select { case <-c: return false // Completed normally case <-time.After(timeout): return true // Timed out } }
Cette fonction enveloppe la fonctionnalité de délai d'attente et la rend facile à utiliser :
if waitTimeout(&wg, time.Second) { fmt.Println("Timed out waiting for wait group") } else { fmt.Println("Wait group finished") }
Cette approche fournit une approche plus propre et un moyen plus pratique de gérer les délais d'attente pour les opérations WaitGroup.Wait().
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!