Heim >Backend-Entwicklung >Golang >Parallelitätsmuster in Go; Arbeiterpools und Fan-Out/Fan-In

Parallelitätsmuster in Go; Arbeiterpools und Fan-Out/Fan-In

DDD
DDDOriginal
2024-10-07 22:11:01657Durchsuche

Concurrency patterns in Go; worker pools and fan-out/fan-in

Go ist für sein außergewöhnliches Parallelitätsmodell bekannt, aber viele Entwickler konzentrieren sich nur auf Goroutinen und Kanäle. Allerdings sorgen Parallelitätsmuster wie Worker-Pools und Fan-Out/Fan-In für echte Effizienz.

In diesem Artikel gehen wir auf diese fortgeschrittenen Konzepte ein und helfen Ihnen dabei, den Durchsatz in Ihren Go-Anwendungen zu maximieren.

Warum Parallelität wichtig ist

Parallelität ermöglicht es Programmen, Aufgaben effizient auszuführen, insbesondere wenn es um Aufgaben wie E/A-Vorgänge, Webanfragen oder Hintergrundverarbeitung geht. In Go bieten Goroutinen eine einfache Möglichkeit, Tausende gleichzeitiger Aufgaben zu verwalten, aber ohne Struktur kann es zu Engpässen kommen. Hier kommen Worker-Pools und Fan-out/Fan-in-Muster ins Spiel.

Arbeiterpools

Worker-Pools ermöglichen es Ihnen, die Anzahl der Goroutinen zu begrenzen, indem Sie Aufgaben festen „Workern“ zuweisen. Dies verhindert eine Überbelegung, reduziert den Ressourcenverbrauch und macht die Aufgabenausführung überschaubar.


package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, jobs <-chan int, results chan<- int, wg *sync.WaitGroup) {
    defer wg.Done()
    for j := range jobs {
        fmt.Printf("Worker %d started job %d\n", id, j)
        time.Sleep(time.Second) // Simulate work
        fmt.Printf("Worker %d finished job %d\n", id, j)
        results <- j * 2
    }
}

func main() {
    jobs := make(chan int, 100)
    results := make(chan int, 100)
    var wg sync.WaitGroup

    // Start 3 workers
    for w := 1; w <= 3; w++ {
        wg.Add(1)
        go worker(w, jobs, results, &wg)
    }

    // Send jobs
    for j := 1; j <= 5; j++ {
        jobs <- j
    }
    close(jobs)

    // Wait for workers to finish
    wg.Wait()
    close(results)

    for result := range results {
        fmt.Println("Result:", result)
    }
}


In diesem Beispiel:

  • Wir haben drei Mitarbeiter, die gleichzeitig Aufträge bearbeiten.
  • Jeder Auftrag wird über Kanäle an die Mitarbeiter weitergeleitet und die Ergebnisse werden zur Bearbeitung gesammelt.

Fan-Out/Fan-In-Muster

Das Fan-Out/Fan-In-Muster ermöglicht es mehreren Goroutinen, dieselbe Aufgabe zu verarbeiten, während Fan-In die Ergebnisse wieder in einer einzigen Ausgabe zusammenfasst. Dies ist nützlich, um Aufgaben aufzuteilen und dann Ergebnisse zusammenzufassen.


package main

import (
    "fmt"
    "sync"
    "time"
)

func workerFanOut(id int, tasks <-chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for task := range tasks {
        fmt.Printf("Worker %d processing task %d\n", id, task)
        time.Sleep(time.Second) // Simulate work
    }
}

func main() {
    var wg sync.WaitGroup
    tasks := make(chan int, 10)

    // Fan-out: Launch multiple workers
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go workerFanOut(i, tasks, &wg)
    }

    // Send tasks
    for i := 1; i <= 9; i++ {
        tasks <- i
    }
    close(tasks)

    // Wait for workers to finish
    wg.Wait()

    fmt.Println("All tasks are processed.")
}


Im Code oben:

  • Fan-Out: Wir erstellen mehrere Goroutinen (Worker), die Aufgaben gleichzeitig erledigen.
  • Fan-In: Nach der Verarbeitung können alle Arbeitsergebnisse zur weiteren Verarbeitung aggregiert werden.

Parallelitätsmuster können angewendet werden, um Webserver, Stapelverarbeitungssysteme oder E/A-gebundene Anwendungen zu optimieren. Die Verwendung von Mustern wie Worker-Pools und Fan-Out/Fan-In gewährleistet eine optimale Ressourcennutzung, ohne die Systemkapazität zu überfordern.

Nächste Schritte zur Erweiterung Ihres Wissens:

  • Erkunden Sie, wie diese Muster auf andere Herausforderungen der Parallelität ausgeweitet werden können.
  • Erstellen Sie einen Echtzeit-Webdienst mit einem Worker-Pool, der Anfragen verwaltet.

Der Schlüssel zum Erfolg in der Parallelität von Go ist die Struktur. Wenn Sie diese Parallelitätsmuster beherrschen, verbessern Sie Ihre Go-Kenntnisse und helfen Ihnen beim Schreiben hochleistungsfähiger Anwendungen.

Weitere Einblicke in Go erhalten Sie im nächsten Beitrag!

Du kannst mich unterstützen, indem du mir ein Buch kaufst :)

Das obige ist der detaillierte Inhalt vonParallelitätsmuster in Go; Arbeiterpools und Fan-Out/Fan-In. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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