Heim >Backend-Entwicklung >Golang >Wie verwaltet man eine feste Anzahl gleichzeitiger Goroutinen in Go?

Wie verwaltet man eine feste Anzahl gleichzeitiger Goroutinen in Go?

DDD
DDDOriginal
2024-12-06 09:15:10434Durchsuche

How to Maintain a Fixed Number of Concurrent Goroutines in Go?

Aufrechterhaltung einer festen Anzahl gleichzeitig laufender Goroutinen

In Go können Sie auf Szenarien stoßen, in denen die Kontrolle der Anzahl gleichzeitig laufender Goroutinen von entscheidender Bedeutung ist. Während sich Tutorials oft darauf konzentrieren, auf den Abschluss von Goroutinen zu warten, stellt das Erreichen einer bestimmten Anzahl aktiver Goroutinen zu einem bestimmten Zeitpunkt eine andere Herausforderung dar.

Stellen Sie sich die folgende Situation vor: Sie müssen Hunderttausende Aufgaben bearbeiten. Für die Verarbeitung jeder Aufgabe ist eine eigene Goroutine erforderlich, Ihre Systemressourcen können jedoch nur maximal 20 Goroutinen gleichzeitig verarbeiten. Sie müssen sicherstellen, dass immer 20 Goroutinen ausgeführt werden und eine neue gestartet wird, sobald eine vorhandene abgeschlossen ist.

Begrenzte Parallelität

Um dies zu erreichen, werden die Go-Parallelitätsmuster verwendet Der Artikel schlägt die Verwendung eines Musters namens „Bounded Parallelism“ vor. Dabei wird ein Kanal leerer Strukturen als Schutz verwendet, um die Anzahl gleichzeitiger Arbeiter zu begrenzen.

Implementierung

Hier ist ein Beispiel, das zeigt, wie dieses Muster implementiert wird:

package main

import (
    "fmt"
    "sync"
)

func main() {
    const maxGoroutines = 20

    // Create a channel of empty structs to control worker count
    guard := make(chan struct{}, maxGoroutines)

    var wg sync.WaitGroup

    // Launch workers
    for i := 0; i < 30; i++ {
        wg.Add(1)
        guard <- struct{}{} // Blocks if guard channel is filled
        go func(n int) {
            defer wg.Done()
            worker(n)
            <-guard // Release slot in guard channel
        }(i)
    }
    wg.Wait()
}

func worker(i int) { fmt.Println("doing work on", i) }

In diesem Beispiel wird der Guard-Kanal als Token-Bucket verwendet. Die maximale Anzahl von Goroutinen, die gleichzeitig ausgeführt werden können, ist durch die Kapazität des Kanals begrenzt (in diesem Fall 20). Jede Goroutine erhält vor Arbeitsbeginn ein „Token“ (eine leere Struktur) vom Kanal. Wenn eine Goroutine fertig ist, gibt sie ihr Token wieder in den Kanal frei und macht es so für eine andere Goroutine zum Erwerb verfügbar. Indem Sie die Anzahl der Token im Kanal steuern, steuern Sie effektiv die Anzahl gleichzeitiger Goroutinen.

Das obige ist der detaillierte Inhalt vonWie verwaltet man eine feste Anzahl gleichzeitiger Goroutinen in Go?. 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