apache之多线程如何影响 http keep-alive 连接

daizhj 阅读:35 2025-06-02 22:19:02 评论:0

var ( 
    httpClient *http.Client 
) 
 
const ( 
    MaxIdleConnections int = 20 
    RequestTimeout     int = 5 
) 
 
// init HTTPClient 
func init() { 
    client := &http.Client{ 
        Transport: &http.Transport{ 
            MaxIdleConnsPerHost: MaxIdleConnections, 
        }, 
        Timeout: time.Duration(RequestTimeout) * time.Second, 
    } 
 
    return client 
} 
 
func makeRequest() { 
    var endPoint string = "https://localhost:8080/doSomething" 
 
    req, err := http.NewRequest("GET", ....) 
     
    response, err := httpClient.Do(req) 
    if err != nil && response == nil { 
        log.Fatalf("Error sending request to API endpoint. %+v", err) 
    } else { 
        // Close the connection to reuse it 
        defer response.Body.Close() 
        body, err := ioutil.ReadAll(response.Body) 
        if err != nil { 
            log.Fatalf("Couldn't parse response body. %+v", err) 
        } 
         
        log.Println("Response Body:", string(body)) 
    } 
} 
我在 Go 中有以下代码。 Go 使用 http-keep-alive 连接。因此,据我了解, httpClient.Do(req)不会创建新连接,因为 golang 使用默认的持久连接。
  • 根据我的理解,HTTP 持久连接一次发出一个请求,即第二个请求只能在第一个响应之后发出。但是,如果多个线程调用 makeRequest()会发生什么 ?将httpClient.Do(req)甚至在前一个请求得到响应之前发送另一个请求?
  • 我假设服务器超时客户端建立的任何保持事件连接。如果服务器超时,那么下一次 httpClient.Do(req)被调用,它会建立一个新的连接吗?
  • 请您参考如下方法:

    一个 http.Client 有一个 Transport ,它将发出请求的许多低级细节委托(delegate)给它。您可以通过为您的客户提供自定义传输来更改几乎任何内容。该答案的其余部分将在很大程度上假设您使用的是 http.DefaultClient 或至少是使用 http.DefaultTransport 的客户端。
    发出新请求时,如果与相应服务器的空闲连接可用,则传输将使用它。
    如果没有可用的空闲连接(因为从来没有空闲连接,或者因为其他 goroutine 正在使用它们,或者因为服务器关闭了连接,或者出现了其他错误),那么传输将考虑建立一个新连接,受 MaxConnsPerHost 限制(默认:无限制)。如果超过 MaxConnsPerHost,则请求将阻塞,直到现有请求完成并且连接可用。否则,将为该请求建立新连接。
    请求完成后,客户端将缓存连接以供以后使用(受 MaxIdleConnsMaxIdleConnsPerHost 限制;DefaultTransport 全局限制为 100 个空闲连接,并且每个主机没有限制)。
    如果空闲连接不用于发出请求,空闲连接将在 IdleConnTimeout 之后关闭;对于 DefaultTransport,限制为 90 秒。
    所有这一切意味着,默认情况下,Go 将建立足够的连接来满足并行性(达到您可以调整的某些限制),但它也会通过将空闲连接池保持一定长度的时间来尽可能地重用 keep-alive 连接时间。


    标签:多线程
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号