第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

關(guān)閉 Go http.Client 的連接池

關(guān)閉 Go http.Client 的連接池

Go
函數(shù)式編程 2023-07-17 14:53:27
出于測試目的,我嘗試net/http.Client在 Go 中創(chuàng)建一個禁用連接池的項目。我想要實現(xiàn)的是每個 HTTP/1.x 請求上的地址都建立一個新的 TCP 連接。目前我有:        c = &http.Client{            Transport: &http.Transport{                DialContext: (&net.Dialer{                    Timeout:   5 * time.Second,                    KeepAlive: 5 * time.Second,                }).DialContext,                TLSHandshakeTimeout:   5 * time.Second,                ResponseHeaderTimeout: 5 * time.Second,                ExpectContinueTimeout: 1 * time.Second,            },        }有什么想法我應(yīng)該如何調(diào)整這個嗎?我發(fā)現(xiàn)如果我設(shè)置c.Transport.MaxIdleConns = 1這個可以工作,但我不確定這是否仍然允許 1 個使用中 + 1 個空閑(總共 2 個)TCP 連接:    // MaxIdleConns controls the maximum number of idle (keep-alive)    // connections across all hosts. Zero means no limit.    MaxIdleConns int同樣,似乎也c.Dialer.KeepAlive = -1可以這樣做:    // KeepAlive specifies the keep-alive period for an active    // network connection.    // If zero, keep-alives are enabled if supported by the protocol    // and operating system. Network protocols or operating systems    // that do not support keep-alives ignore this field.    // If negative, keep-alives are disabled.但我不確定 TCP 連接 + Keep-Alive + HTTP 的行為。另一種方法是嘗試盡快殺死空閑的 TCP 連接,所以我設(shè)置了c.Transport.IdleConnTimeout = 1*time.Nanosecond.當我這樣做時,我Client.Do()現(xiàn)在偶爾會返回錯誤:tls: use of closed connection我懷疑這是一個 Go stdlib 問題(可能是一場競賽),它使用了應(yīng)該從池中取出的連接。
查看完整描述

3 回答

?
哆啦的時光機

TA貢獻1779條經(jīng)驗 獲得超6個贊

連接被添加到函數(shù)Transport.tryPutIdleConn中的池中。如果Transport.DisableKeepAlives為 true 或?Transport.MaxIdleConnsPerHost小于零,則不會合并連接。

設(shè)置任一值都會禁用池化。Connection: close當DisableKeepAlives 為true 時,傳輸會添加請求標頭。這可能是理想的,也可能不是理想的,具體取決于您正在測試的內(nèi)容。

設(shè)置DisableKeepAlives的方法如下:

t?:=?http.DefaultTransport.(*http.Transport).Clone()
t.DisableKeepAlives?=?true
c?:=?&http.Client{Transport:?t}

在操場上運行DisableKeepAlives = true 的演示。

設(shè)置 MaxIdleConnsPerHost 的方法如下:

t?:=?http.DefaultTransport.(*http.Transport).Clone()
t.MaxIdleConnsPerHost?=?-1
c?:=?&http.Client{Transport:?t}

在操場上運行 MaxIdleConnsPerHost = -1 的演示。

上面的代碼克隆了默認傳輸以確保使用默認傳輸選項。如果您明確想要問題中的選項,請使用

????c?=?&http.Client{
????????Transport:?&http.Transport{
????????????DialContext:?(&net.Dialer{
????????????????Timeout:???5?*?time.Second,
????????????????KeepAlive:?5?*?time.Second,
????????????}).DialContext,
????????????TLSHandshakeTimeout:???5?*?time.Second,
????????????ResponseHeaderTimeout:?5?*?time.Second,
????????????ExpectContinueTimeout:?1?*?time.Second,
????????????DisableKeepAlives:?true,
????????},
????}

或者

????c?=?&http.Client{
????????Transport:?&http.Transport{
????????????DialContext:?(&net.Dialer{
????????????????Timeout:???5?*?time.Second,
????????????????KeepAlive:?5?*?time.Second,
????????????}).DialContext,
????????????TLSHandshakeTimeout:???5?*?time.Second,
????????????ResponseHeaderTimeout:?5?*?time.Second,
????????????ExpectContinueTimeout:?1?*?time.Second,
????????????MaxIdleConnsPerHost:?-1,
????????},
????}

MaxIdleConnsPerHost 不限制每個主機的活動連接數(shù)。?

通過將Dialer.KeepAlive設(shè)置為 -1,不會禁用池 。


查看完整回答
反對 回復 2023-07-17
?
飲歌長嘯

TA貢獻1951條經(jīng)驗 獲得超3個贊

您需要將DisableKeepAlives、true和MaxIdleConnsPerHost-1 設(shè)置為。


從文檔中:


// DisableKeepAlives, if true, disables HTTP keep-alives and

// will only use the connection to the server for a single

// HTTP request.

https://golang.org/src/net/http/transport.go,第 166 和 187 行


因此,您的客戶端必須按如下方式初始化


c = &http.Client{

    Transport: &http.Transport{

        DialContext: (&net.Dialer{

            Timeout:   5 * time.Second,

        }).DialContext,

        TLSHandshakeTimeout:   5 * time.Second,

        ResponseHeaderTimeout: 5 * time.Second,

        ExpectContinueTimeout: 1 * time.Second,

        DisableKeepAlives: true,

        MaxIdleConnsPerHost: -1

    },

}

如果您使用 1.7 之前的 Go 版本,那么您需要消耗主體的所有緩沖區(qū),并且只有在調(diào)用request.Body.Close(). 相反,如果您使用的版本大于或等于 1.7,則可以推遲關(guān)閉,而無需采取額外的預防措施。


禁用連接池但仍然能夠執(zhí)行并行請求的示例庫: https: //github.com/alessiosavi/Requests


查看完整回答
反對 回復 2023-07-17
?
紅顏莎娜

TA貢獻1842條經(jīng)驗 獲得超13個贊

http.Transport 有一個名為MaxConnsPerHost

MaxConnsPerHost 可以選擇限制每個主機的連接總數(shù),包括處于撥號、活動和空閑狀態(tài)的連接。

包括撥號、活動和空閑狀態(tài)


查看完整回答
反對 回復 2023-07-17
  • 3 回答
  • 0 關(guān)注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號