首頁 > 後端開發 > Golang > 如何透過 Channel 有效限制並發 Go 例程?

如何透過 Channel 有效限制並發 Go 例程?

Barbara Streisand
發布: 2024-11-03 08:45:29
原創
1036 人瀏覽過

How to Effectively Limit Concurrent Go Routines with Channels?

限制並發 Go 例程的數量

當處理需要非同步處理的 URL 清單時,通常需要將並發 goroutine 的數量限制為防止資源過多。解決方案涉及創建一個有界通道來控制可以同時執行的 goroutine 的最大數量。

原始嘗試

在原始嘗試中,創建了一個大小為並行的緩衝通道:

<code class="go">results := make(chan string, *parallel)</code>
登入後複製

目的是當結果通道已滿時,程式將阻塞,直到從通道讀取一個值,從而允許產生另一個goroutine。然而,這種方法並不能有效地限制 goroutine 的數量,因為當所有 URL 都處理完畢後,主程式不會阻塞。

解決方案

更有效的解決方案是創建一個固定的工作協程的數量:

<code class="go">for i := 0; i < *parallel; i++ {
    wg.Add(1)
    go func() {
        defer wg.Done()
        for url := range urls {
            worker(url, client, results)
        }
    }()
}</code>
登入後複製

在此解決方案中,協程負責從通道取得URL 並處理它們。該通道從 feeder goroutine 中取得 URL,一旦檢索到所有 URL,feeder goroutine 就會關閉通道,並向工作執行緒發出訊號以完成任務。

一個單獨的 goroutine 監視工作執行緒的完成狀態goroutine,當所有工作人員完成後關閉結果通道。這種方法有效地將運行的 goroutine 數量限制為指定的並行計數。

以上是如何透過 Channel 有效限制並發 Go 例程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板