Maison >développement back-end >Golang >Comment puis-je contrôler l'ordre d'exécution des routines Go ?

Comment puis-je contrôler l'ordre d'exécution des routines Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-13 21:59:31245parcourir

How Can I Control the Execution Order of Go Routines?

Ordre d'exécution de routine Go

Ce code présente le concept d'ordre d'exécution de routine Go, où deux routines "go" simultanées, ou goroutines , sont exécutés simultanément mais sans aucun ordre garanti.

Le code définit une fonction somme qui prend un tableau d'entiers et un canal comme entrées. Cette fonction calcule la somme des entiers du tableau et envoie le résultat au canal fourni.

Dans la fonction principale, un canal c est créé pour faciliter la communication entre les goroutines. Deux goroutines sont lancées, chacune exécutant la fonction somme avec des tableaux d'entrée différents et envoyant le résultat à c.

Le programme reçoit ensuite les valeurs envoyées par les goroutines depuis le canal c et les imprime. Cependant, l'ordre dans lequel les goroutines se terminent est non déterministe, donc l'ordre de sortie peut varier.

Pour contrôler l'ordre d'exécution des goroutines, vous pouvez utiliser divers mécanismes comme des canaux de blocage ou des primitives de synchronisation fournies par la norme. bibliothèque. Voici quelques exemples :

1. Blocage des canaux :

Dans cette version modifiée, les goroutines sont exécutées séquentiellement en bloquant la routine principale jusqu'à ce qu'une valeur soit reçue du canal :

func main() {
    c := make(chan int)

    go sum([]int{1, 2, 3}, c)

    // Block until a value is received from c
    x := <-c
    fmt.Println(x)

    go sum([]int{4, 5, 6}, c)

    // Block until a value is received from c
    x = <-c
    fmt.Println(x)
}

2. Groupe d'attente avec canaux :

Une autre option consiste à utiliser un groupe d'attente et une plage sur le canal pour garantir que toutes les goroutines ont terminé leur exécution avant de traiter les résultats :

func main() {
    c := make(chan int)
    wg := new(sync.WaitGroup)

    wg.Add(1)
    go sum([]int{1, 2, 3}, c, wg)
    wg.Wait()

    wg.Add(1)
    go sum([]int{4, 5, 6}, c, wg)
    wg.Wait()

    close(c)

    for x := range c {
        fmt.Println(x)
    }
}

Ces techniques vous permettent de contrôler l'ordre d'exécution des goroutines pour obtenir le comportement souhaité dans vos programmes concurrents.

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!

Déclaration:
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