Maison  >  Article  >  développement back-end  >  L'utilisation de « go f(i) » est-elle le moyen optimal d'obtenir le parallélisme dans Go, ou devrions-nous explorer des méthodes alternatives comme des canaux et des travailleurs dédiés pour chaque goroutine ?

L'utilisation de « go f(i) » est-elle le moyen optimal d'obtenir le parallélisme dans Go, ou devrions-nous explorer des méthodes alternatives comme des canaux et des travailleurs dédiés pour chaque goroutine ?

DDD
DDDoriginal
2024-11-06 04:59:02346parcourir

Is using `go f(i)` the optimal way to achieve parallelism in Go, or should we explore alternative methods like channels and dedicated workers for each goroutine?

Traitement parallèle dans Go

Problème :

Considérez l'extrait de code Go donné :

<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>

Questions :

  1. Pouvons-nous supposer que la fonction « dowork » s'exécutera en parallèle ?
  2. Est-ce une manière appropriée d'atteindre le parallélisme, ou devrions-nous utiliser des canaux et séparer les travailleurs « dowork » pour chaque goroutine ?

Réponse :

Concernant GOMAXPROCS :

Selon les notes de version de Go 1.5 :

"Par défaut, les programmes Go s'exécutent avec GOMAXPROCS défini sur le nombre de cœurs disponibles ; dans les versions précédentes, la valeur par défaut était 1."

Concernant Empêcher la sortie de la fonction principale :

Pour empêcher la fonction « principale » de se fermer immédiatement, le type « WaitGroup » peut être utilisé, en particulier la fonction « Attendre ».

Concernant le parallélisme :

Pour faciliter le traitement parallèle de groupes de fonctions, une fonction d'assistance peut être utilisée :

<code class="go">import "sync"

// Parallelize executes functions concurrently
func Parallelize(functions ...func()) {
    var waitGroup sync.WaitGroup
    waitGroup.Add(len(functions))

    defer waitGroup.Wait()

    for _, function := range functions {
        go func(f func()) {
            defer waitGroup.Done()
            f()
        }(function)
    }
}</code>

Dans votre cas, le parallélisme peut être réalisé comme suit :

<code class="go">func1 := func() {
    f(0)
}

func2 = func() {
    f(1)
}

func3 = func() {
    f(2)
}

Parallelize(func1, func2, func3)</code>

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