亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索

Golang如何實現(xiàn)HTTP請求并發(fā)控制

P粉602998670
發(fā)布: 2025-10-16 22:35:01
原創(chuàng)
106人瀏覽過
使用channel信號量可限制并發(fā)數(shù),通過固定容量channel作為令牌控制同時運行的goroutine數(shù)量;示例中以10為最大并發(fā),利用sem<-struct{}{}獲取令牌,defer觸發(fā)<-sem釋放,結合WaitGroup等待所有任務完成;還可采用Worker池模式,預先啟動固定worker協(xié)程從任務channel消費URL,更優(yōu)管理資源;同時應結合context實現(xiàn)超時與取消,使用WithTimeout創(chuàng)建帶超時的ctx并傳入Do方法,確保單個請求不阻塞整體流程,提升健壯性;關鍵細節(jié)包括關閉resp.Body和正確釋放channel令牌,避免資源泄漏。

golang如何實現(xiàn)http請求并發(fā)控制

在Go語言中處理HTTP請求的并發(fā)控制,關鍵在于合理使用goroutine、channel和context。直接大量發(fā)起HTTP請求可能導致資源耗盡或被目標服務限流,因此需要對并發(fā)數(shù)量進行限制。下面介紹幾種常見的實現(xiàn)方式。

使用帶緩沖的channel控制并發(fā)數(shù)

通過一個固定容量的channel作為信號量,可以有效限制同時運行的goroutine數(shù)量。

定義一個channel,容量即為最大并發(fā)數(shù)。每次啟動一個請求前先向channel寫入數(shù)據(占位),請求完成后再讀出,這樣就能保證最多只有N個請求同時進行。

示例代碼:

func fetch(urls []string) {
    client := &http.Client{Timeout: 10 * time.Second}
    sem := make(chan struct{}, 10) // 最大并發(fā)10
    var wg sync.WaitGroup
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">for _, url := range urls {
    wg.Add(1)
    go func(u string) {
        defer wg.Done()
        sem <- struct{}{}        // 獲取令牌
        defer func() { <-sem }() // 釋放令牌

        resp, err := client.Do(http.NewRequest("GET", u, nil))
        if err != nil {
            log.Printf("Error fetching %s: %v", u, err)
            return
        }
        defer resp.Body.Close()
        // 處理響應
    }(url)
}
wg.Wait()
登錄后復制

}

立即學習go語言免費學習筆記(深入)”;

使用Worker池模式

預先啟動固定數(shù)量的工作協(xié)程,通過任務隊列分發(fā)URL,避免動態(tài)創(chuàng)建過多goroutine。

PatentPal專利申請寫作
PatentPal專利申請寫作

AI軟件來為專利申請自動生成內容

PatentPal專利申請寫作13
查看詳情 PatentPal專利申請寫作

這種方式更適用于大規(guī)模任務調度,能更好地控制內存和系統(tǒng)資源使用。

- 創(chuàng)建一個任務channel接收待請求的URL - 啟動固定數(shù)量的worker從channel讀取并執(zhí)行請求 - 使用WaitGroup等待所有任務完成

結合Context實現(xiàn)超時與取消

每個HTTP請求應綁定獨立的context,設置合理的超時時間,防止某個請求長時間阻塞整個流程。

可以在請求級別設置超時,也可以為整批請求設置統(tǒng)一的上下文控制。

建議做法:

- 使用ctx, cancel := context.WithTimeout(context.Background(), totalTimeout)控制整體執(zhí)行時間 - 將context傳入http.NewRequestWithContext - 在defer中調用cancel()釋放資源

基本上就這些??刂撇l(fā)的核心是限制同時運行的請求數(shù)量,channel信號量簡單直接,worker池適合復雜場景,加上context能提升程序健壯性。不復雜但容易忽略細節(jié),比如忘記關閉response body或未正確釋放channel令牌。

以上就是Golang如何實現(xiàn)HTTP請求并發(fā)控制的詳細內容,更多請關注php中文網其它相關文章!

最佳 Windows 性能的頂級免費優(yōu)化軟件
最佳 Windows 性能的頂級免費優(yōu)化軟件

每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。

下載
來源:php中文網
本文內容由網友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權的內容,請聯(lián)系admin@php.cn
最新問題
開源免費商場系統(tǒng)廣告
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關于我們 免責申明 意見反饋 講師合作 廣告合作 最新更新
php中文網:公益在線php培訓,幫助PHP學習者快速成長!
關注服務號 技術交流群
PHP中文網訂閱號
每天精選資源文章推送
PHP中文網APP
隨時隨地碎片化學習
PHP中文網抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號