Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann die gleichzeitige Goroutine-Ausführung in Go eingeschränkt werden?

Wie kann die gleichzeitige Goroutine-Ausführung in Go eingeschränkt werden?

Linda Hamilton
Linda HamiltonOriginal
2024-11-02 05:27:02964Durchsuche

How to Limit Concurrent Goroutine Execution in Go?

Begrenzung der gleichzeitigen Ausführung von Goroutinen

Stellen Sie sich ein Szenario vor, in dem Sie eine Liste mit zu verarbeitenden URLs haben und die Anzahl der gleichzeitig ausgeführten Goroutinen begrenzen möchten . Wenn Sie beispielsweise 30 URLs haben, möchten Sie möglicherweise nur 10 Goroutinen parallel arbeiten.

Der bereitgestellte Code versucht, einen gepufferten Kanal der Größe parallel zu verwenden, um die Anzahl der ausgeführten Goroutinen zu begrenzen . Allerdings scheint dieser Ansatz nach der Verarbeitung aller URLs nicht zu blockieren. Eine effektivere Möglichkeit, diese Parallelitätsbeschränkung zu erreichen, besteht darin, eine bestimmte Anzahl von Worker-Goroutinen zu erstellen und ihnen über einen dedizierten Kanal URLs zuzuführen.

Hier ist eine verbesserte Version des Codes:

<code class="go">parallel := flag.Int("parallel", 10, "max parallel requests allowed")
flag.Parse()
urls := flag.Args()

// Create a channel to hold URLs that workers will consume
workerURLChan := make(chan string)

// Start a goroutine to feed URLs to the workers
go func() {
    for _, u := range flag.Args() {
        workerURLChan <- u
    }

    // Once all URLs have been distributed, close the channel, which will cause workers to exit
    close(workerURLChan)
}()

var wg sync.WaitGroup
client := rest.Client{}

results := make(chan string)

// Start the specified number of worker goroutines
for i := 0; i < *parallel; i++ {
    wg.Add(1)
    go func() {
        defer wg.Done()

        // Workers repeatedly fetch URLs from the channel until it is closed
        for url := range workerURLChan {
            worker(url, client, results)
        }
    }()
}

// Close the results channel when all workers have completed, which will allow the main goroutine to exit
go func() {
    wg.Wait()
    close(results)
}()

// Receive and print results from the worker goroutines
for res := range results {
    fmt.Println(res)
}</code>

In diesem aktualisierten Code erstellen wir eine Worker-Goroutine für jede zulässige gleichzeitige Ausführung, und diese Worker rufen URLs vom dedizierten Kanal ab. Sobald alle URLs verteilt wurden, wird der workerURLChan geschlossen, was dazu führt, dass die Worker beendet werden, wenn ihre aktuelle URL abgeschlossen ist. Dieser Mechanismus begrenzt effektiv die Anzahl gleichzeitig ausgeführter Goroutinen.

Das obige ist der detaillierte Inhalt vonWie kann die gleichzeitige Goroutine-Ausführung in Go eingeschränkt werden?. 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