Ist die Verwendung von „go f(i)' der optimale Weg, um Parallelität in Go zu erreichen, oder sollten wir alternative Methoden wie Kanäle und dedizierte Mitarbeiter für jede Goroutine erkunden?

DDD
Freigeben: 2024-11-06 04:59:02
Original
364 Leute haben es durchsucht

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?

Parallele Verarbeitung in Go

Problem:

Bedenken Sie den angegebenen Go-Codeausschnitt:

<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>
Nach dem Login kopieren

Fragen:

  1. Können wir davon ausgehen, dass die „Dowork“-Funktion parallel ausgeführt wird?
  2. Ist dies ein geeigneter Weg, um Parallelität zu erreichen, oder sollten wir das tun? Kanäle und separate „Dowork“-Worker für jede Goroutine verwenden?

Antwort:

Bezüglich GOMAXPROCS:

In den Versionshinweisen zu Go 1.5 heißt es:

„Standardmäßig werden Go-Programme mit GOMAXPROCS ausgeführt, das auf die Anzahl der verfügbaren Kerne eingestellt ist; in früheren Versionen war es standardmäßig 1.“

Bezüglich Verhindern des Beendens der Hauptfunktion:

Um zu verhindern, dass die „Haupt“-Funktion sofort beendet wird, kann der Typ „WaitGroup“ verwendet werden, insbesondere die Funktion „Wait“.

Bezüglich Parallelität:

Um die parallele Verarbeitung von Funktionsgruppen zu erleichtern, kann eine Hilfsfunktion eingesetzt werden:

<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>
Nach dem Login kopieren

In Ihrem Fall kann Parallelität wie folgt erreicht werden:

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

func2 = func() {
    f(1)
}

func3 = func() {
    f(2)
}

Parallelize(func1, func2, func3)</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonIst die Verwendung von „go f(i)' der optimale Weg, um Parallelität in Go zu erreichen, oder sollten wir alternative Methoden wie Kanäle und dedizierte Mitarbeiter für jede Goroutine erkunden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!