Maison > développement back-end > Golang > 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
Libérer: 2024-11-06 04:59:02
original
571 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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