首頁  >  文章  >  後端開發  >  Go 中如何限制 Goroutine 並發執行?

Go 中如何限制 Goroutine 並發執行?

Linda Hamilton
Linda Hamilton原創
2024-11-02 05:27:02964瀏覽

How to Limit Concurrent Goroutine Execution in Go?

限制並發Goroutine 執行

考慮一個場景,您有一個要處理的URL 列表,並且想要限制運行的並發Goroutine 的數量。例如,如果您有 30 個 URL,您可能只需要 10 個並行工作的 goroutine。

提供的程式碼嘗試使用大小為 parallel 的緩衝通道來限制運行的 goroutine 數量。然而,這種方法在處理完所有 URL 後似乎並沒有阻塞。實現此並發限制的更有效方法是建立指定數量的工作 goroutine 並透過專用通道向它們提供 URL。

這是程式碼的改進版本:

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

在此更新的程式碼中,我們為每個允許的並發執行創建一個工作協程,這些工作協程從專用通道獲取URL。一旦所有 URL 都已分發,workerURLChan 就會關閉,這會在當前 URL 完成時觸發工作人員退出。這種機制有效限制了並發運行的 goroutine 數量。

以上是Go 中如何限制 Goroutine 並發執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn