亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

轉到 http.Get、并發和“對等方重置連接”

轉到 http.Get、并發和“對等方重置連接”

Go
慕勒3428872 2022-01-17 17:58:28
我有 1000-2000 個網頁要從一臺服務器下載,我正在使用 go 例程和通道來實現高效率。問題是每次我運行我的程序時,最多 400 個請求都會失敗,并出現錯誤“對等方重置連接”。很少(可能 10 次中有 1 次)沒有請求失敗。我能做些什么來防止這種情況發生?有趣的一件事是,當我在與托管網站的服務器位于同一國家/地區的服務器上運行該程序時,0 個請求失敗,所以我猜測延遲存在一些問題(因為它現在運行在服務器在不同的大陸)。我使用的代碼基本上只是一個簡單的 http.Get(url) 請求,沒有額外的參數或自定義客戶端。
查看完整描述

3 回答

?
UYOU

TA貢獻1878條經驗 獲得超4個贊

該消息connection reset by peer表明遠程服務器發送了一個RST強制關閉連接,或者是故意作為限制連接的機制,或者是由于缺乏資源。無論哪種方式,您都可能打開太多連接,或者重新連接太快。

并行啟動 1000-2000 個連接很少是下載這么多頁面的最有效方式,尤其是當大部分或全部來自單個服務器時。如果您測試吞吐量,您會發現最佳并發級別要低得多。

您還需要設置Transport.MaxIdleConnsPerHost以匹配您的并發級別。如果MaxIdleConnsPerHost低于預期的并發連接數,服務器連接通常會在請求后關閉,然后立即再次打開——這將顯著減慢您的進度,并可能達到服務器施加的連接限制。



查看完整回答
反對 回復 2022-01-17
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

仍然是一個golang新手,希望這會有所幫助。


var netClient = &http.Client{}


func init() {

    tr := &http.Transport{

        MaxIdleConns:       20,

        MaxIdleConnsPerHost:  20,

    }

    netClient = &http.Client{Transport: tr}

}


func foo() {

    resp, err := netClient.Get("http://www.example.com/")

}


查看完整回答
反對 回復 2022-01-17
?
森欄

TA貢獻1810條經驗 獲得超5個贊

MaxConnsPerHost通過設置運輸選項,我得到了很好的結果......


cl := &http.Client{

    Transport: &http.Transport{MaxConnsPerHost: 50}

}

MaxConnsPerHost 可以選擇限制每個主機的連接總數,包括處于撥號、活動和空閑狀態的連接。違反限制時,撥號將阻塞。


https://golang.org/pkg/net/http/#Transport.MaxConnsPerHost


編輯:為了澄清,這個選項是在 Go 1.11 中發布的,在上面@AG1 或@JimB 的答案時不可用,因此我發布了這個。


查看完整回答
反對 回復 2022-01-17
  • 3 回答
  • 0 關注
  • 215 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號