Maison >développement back-end >Golang >Comment les canaux et les travailleurs séparés peuvent-ils améliorer le parallélisme dans Go par rapport à l'utilisation de goroutines seules ?

Comment les canaux et les travailleurs séparés peuvent-ils améliorer le parallélisme dans Go par rapport à l'utilisation de goroutines seules ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-05 03:48:02483parcourir

How can channels and separate workers improve parallelism in Go compared to using goroutines alone?

Traitement parallèle dans Go

La programmation parallèle implique l'exécution de plusieurs tâches simultanément, ce qui permet d'améliorer les performances des applications qui peuvent être divisées en unités indépendantes. Une façon d'obtenir le parallélisme dans Go consiste à utiliser des goroutines, des threads légers qui s'exécutent simultanément avec le programme principal.

Considérez le code suivant :

<code class="go">package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    for i := 0; i < 3; i++ {
        go f(i)
    }

    // prevent main from exiting immediately
    var input string
    fmt.Scanln(&input)
}

func f(n int) {
    for i := 0; i < 10; i++ {
        dowork(n, i)
        amt := time.Duration(rand.Intn(250))
        time.Sleep(time.Millisecond * amt)
    }
}

func dowork(goroutine, loopindex int) {
    // simulate work
    time.Sleep(time.Second * time.Duration(5))
    fmt.Printf("gr[%d]: i=%d\n", goroutine, loopindex)
}</code>

Ce code utilise des goroutines pour exécuter simultanément le f fonctionner trois fois. La fonction dowork simule un certain travail en dormant pendant 5 secondes.

Pouvez-vous supposer que la fonction dowork s'exécutera en parallèle ?

Oui, vous pouvez faire cette hypothèse. Par défaut, Go définit GOMAXPROCS sur le nombre de cœurs disponibles, ce qui permet à plusieurs goroutines de s'exécuter simultanément.

Est-ce une manière correcte d'obtenir le parallélisme ?

C'est un moyen valable d’atteindre le parallélisme, mais ce n’est peut-être pas l’approche la plus efficace. L'utilisation de goroutines sans mécanismes de synchronisation peut entraîner des courses de données et des résultats incorrects.

Utiliser des canaux et des tâches de travail séparées

Une manière plus structurée et évolutive d'obtenir le parallélisme consiste à utiliser canaux et travailleurs de travaux séparés. Cette approche garantit que chaque goroutine dispose de sa propre copie de données partagées et communique par transmission de messages.

Voici un exemple utilisant des canaux :

<code class="go">var results = make(chan int) // channel to collect results

func main() {
    // spawn a worker for each goroutine
    for i := 0; i < 3; i++ {
        go worker(i)
    }

    // collect results from the worker goroutines
    for i := 0; i < 10; i++ {
        result := <-results
        fmt.Println("Received result:", result)
    }
}

func worker(n int) {
    for i := 0; i < 10; i++ {
        // perform work and send result through the channel
        res := dowork(n, i)
        results <- res
    }
}</code>

Conclusion

Le parallélisme en Go peut être réalisé avec des goroutines. L'utilisation de canaux et de travailleurs distincts constitue une approche plus structurée et évolutive qui garantit l'intégrité des données et améliore les performances.

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