Maison > développement back-end > Golang > Comment attendre gracieusement la fin des routines Go : canaux booléens contre sync.WaitGroup ?

Comment attendre gracieusement la fin des routines Go : canaux booléens contre sync.WaitGroup ?

DDD
Libérer: 2024-12-05 14:45:12
original
930 Les gens l'ont consulté

How to Gracefully Wait for Go Routines to Finish: Boolean Channels vs. sync.WaitGroup?

Comment attendre gracieusement la fin des routines Go

Lors du développement avec Go, il est crucial de s'assurer que les routines se terminent avant de quitter le programme. L'utilisation d'un canal booléen, comme illustré dans le lien Playground fourni, peut efficacement y parvenir.

Comprendre le fonctionnement du canal

L'opération de blocage <- done suspend l'exécution du programme jusqu'à ce qu'une valeur vraie ou fausse soit envoyée via le canal. Par conséquent, dans le code donné, la fonction main() attend que done reçoive le booléen true de la routine do_stuff.

Gestion des scénarios de blocage

Décommentation de la dernière ligne, <-done entraîne un blocage car le canal est vide. Sans qu'une autre routine ne lui envoie des valeurs, la fonction main() reste bloquée indéfiniment. Pour éviter cette situation, il est essentiel de s'assurer qu'une routine envoie toujours une valeur via le canal lorsque prévu, signalant l'achèvement à la fonction d'attente.

Approches alternatives

Alors la méthode du canal booléen est une solution simple, le package de synchronisation fournit des options supplémentaires pour coordonner les opérations simultanées. Considérez le code suivant :

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            longOp()
            wg.Done()
        }()
    }
    // Waits until all routines complete (wg.Done called 10 times)
    wg.Wait()
}

func longOp() {
    time.Sleep(time.Second * 2)
    fmt.Println("Long operation completed")
}
Copier après la connexion

Dans ce scénario, sync.WaitGroup est utilisé pour suivre et synchroniser les routines simultanées, en garantissant que main() attend la fin de toutes les routines avant de poursuivre l'exécution.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal