Home  >  Article  >  Backend Development  >  How to Limit Concurrent Goroutine Execution in Go?

How to Limit Concurrent Goroutine Execution in Go?

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

How to Limit Concurrent Goroutine Execution in Go?

Limiting Concurrent Goroutine Execution

Consider a scenario where you have a list of URLs to process and want to limit the number of concurrent goroutines running. For instance, if you have 30 URLs, you may only want 10 goroutines working in parallel.

The provided code attempts to use a buffered channel of size parallel to limit the number of goroutines running. However, this approach doesn't seem to block after processing all the URLs. A more effective way to achieve this concurrency limitation is to create a specified number of worker goroutines and feed them URLs through a dedicated channel.

Here's an improved version of the code:

<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 this updated code, we create a worker goroutine for each allowed concurrent execution, and these workers fetch URLs from the dedicated channel. Once all URLs have been distributed, the workerURLChan is closed, which triggers the workers to exit when their current URL is completed. This mechanism effectively limits the number of concurrent goroutines running.

The above is the detailed content of How to Limit Concurrent Goroutine Execution in Go?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn