为什么 Go HTTPS 客户端不重用连接?

2023-11-24

我有一个 http 客户端,它创建与主机的多个连接。我想设置它可以设置到特定主机的最大连接数。 go的request.Transport中没有这样的选项。 我的代码看起来像

package main 

import (
  "fmt"
  "net/http"
  "net/url"
)

const (
  endpoint_url_fmt      = "https://blah.com/api1?%s"
)


func main() {

  transport := http.Transport{ DisableKeepAlives : false }

  outParams := url.Values{}
  outParams.Set("method", "write")
  outParams.Set("message", "BLAH")

  for {
    // Encode as part of URI.
    outboundRequest, err := http.NewRequest(
      "GET",
      fmt.Sprintf(endpoint_url_fmt, outParams.Encode()),
      nil
    )
    outboundRequest.Close = false
    _ , err = transport.RoundTrip(outboundRequest)
    if err != nil {
      fmt.Println(err)
    }
  }

}

我希望这会创建 1 个连接。正如我在 for 循环中调用它一样。但这会不断创建无限数量的连接。

使用 requests 库的类似 python 代码仅创建一个连接。

#!/usr/bin/env python
import requests
endpoint_url_fmt      = "https://something.com/restserver.php"
params = {}
params['method'] = 'write'
params['category'] = category_errors_scuba
params['message'] = "blah"
while True:
  r = requests.get(endpoint_url_fmt, params = params)

由于某种原因,go 代码没有重用 http 连接。

编辑 : go 代码需要关闭主体才能重用连接。

 resp , err = transport.RoundTrip(outboundRequest)
 resp.Close() //  This allows the connection to be reused

基于OP的进一步澄清。默认客户端does重用连接。

请务必关闭response.

读取完毕后,调用者应关闭 resp.Body。如果 resp.Body 未关闭,客户端的底层 RoundTripper(通常是 Transport)可能无法重新使用与服务器的持久 TCP 连接来进行后续的“保持活动”请求。

另外,我发现我还需要阅读直到回复完成在调用 Close() 之前。

e.g.

res, _ := client.Do(req)
io.Copy(ioutil.Discard, res.Body)
res.Body.Close()

为了确保 http.Client 连接重用,请务必执行以下两件事:

  • 阅读直到响应完成(即ioutil.ReadAll(resp.Body))
  • Call Body.Close()

旧答案,对于速率限制有用,但不是OP所追求的:

我不认为可以通过 golang 1.1 http API 设置最大连接数。这意味着如果你不小心的话,你可能会因为大量的 TCP 连接而搬起石头砸自己的脚(直到你用完文件描述符或其他什么)。

也就是说,你可以限制调用 go 例程的速率通过 time.Tick 对于特定主机(以及出站请求和连接)。

例如:

import "time"

requests_per_second := 5
throttle := time.Tick(1000000000 / requests_per_second)

for i := 0; i < 16; i += 1 {
  <-throttle  
  go serveQueue()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Go HTTPS 客户端不重用连接? 的相关文章

随机推荐

  • 在 Meteor-Cordova 应用程序中播放声音

    使用没有cordova的流星我可以在浏览器中使用以下命令播放声音 new Audio test mp3 play where test mp3位于公用文件夹中 但是 一旦我在设备上将我的应用程序作为 cordova 应用程序运行 我就无法播
  • 选择元素的增长方式与显示 Flex 中的输入元素的增长方式不同

    我出现了意想不到的行为在我的设置中 输入按预期水平增长 但在具有选择控件的行上 增长似乎被扭曲 我怀疑某些风格有所不同 但仔细检查后却一无所获 谷歌搜索没有给出任何信息 我找不到任何关于隐式边距或选择填充的信息 这是关于什么的以及我该如何杀
  • JavaScript 异常列表

    这次我没有任何问题 但出于好奇 我想知道 JavaScript 中有多少异常 例如我正在使用以下代码
  • 将 pandas csv 保存到子目录

    我试图将以下代码的输出保存到子目录中 for gp in g filename gp 0 csv print filename gp 1 to csv filename 我首先创建了子目录 os makedirs MonthlyDataSp
  • 俄语 mongodb 全文搜索

    我正在尝试在 mongodb 中使用全文搜索 gt db collection insert text gt db collection insert text gt db collection insert text gt db coll
  • 无法验证应用程序并将其提交到 Mac App Store

    我已经为 iOS 应用程序进行了无数次协同设计和提交 这次让我震惊的是 Mac App Store 我反复收到相同的错误消息 我的名字 是一个有效的身份 然而 您没有关联的包标识 我在堆栈溢出上认识到这两个主题 mas 代码签名身份私钥 a
  • 当使用 Object.create(null) 创建对象时 __proto__ 如何工作

    考虑以下 JavaScript 代码 var a Object create null a foo 1 var b Object create a console log b foo prints 1 console log b proto
  • 切换两个 INT 变量的大小写

    考虑以下代码 if xPoint gt 0 yPoint gt 0 m navigations Directions SouthEast else if xPoint gt 0 yPoint lt 0 m navigations Direc
  • 如何在UIView上设置渐变边框?

    在上面放置一个简单的边框非常容易UIView 您只需链接到QuartzCore 导入它并使用 self view layer borderColor UIColor redColor CGColor self view layer bord
  • 使用fork时内存是如何映射的?

    我是 fork 的新手 我到处都读到 当调用 fork 时 当前 调用 进程的精确副本就会启动 现在 当我运行以下代码时 应该有两个不同的进程 有两个不同的进程分配给它们的变量和函数的内存位置 include
  • 如何关闭 sbcl 中的调试器

    我目前正在尝试学习 common lisp 并且一直在使用 sbcl 我希望这是一个不错的实现选择 来自 ruby 和 irb 的我发现此时每个错误的自动转移到调试器有点烦人 有没有办法在我玩的时候暂时关闭它 Common Lisp 有一个
  • Wicked PDF +字体+heroku+rails3.2

    我在用着邪恶 pdf使用 Rails 3 2 11 和 ruby 1 9 3 从 HTML 生成 PDF 并部署到 Heroku 我的 pdf css scss erb font face font family DosisMedium f
  • 如何在 Symfony 4 结构的参数文件中检索环境变量?

    我使用 Symfony Flex 进行了全新的 Symfony 安装 新的框架属于下一个 Symfony 4 目录结构 我添加并配置第一个第三方包 HWIOAuthBundle 该捆绑包用于使用两个秘密信息通过 Twitter 进行连接 我
  • 计算两个 NSString 之间的差异数

    如何计算两个 NSString 之间的差异数 Example NSString 1 this is a string NSString 2 Tihs isa string 应返回 4 一个用于大写 T 一个用于 i h 和缺少的空格 您正在
  • 迭代 NSString 中所有字符的最有效方法

    迭代 NSString 中所有字符的最佳方法是什么 您想循环遍历字符串的长度并使用该方法吗 aNSString characterAtIndex index 或者您想使用基于 NSString 的字符缓冲区 我认为人们了解如何处理 unic
  • 创建多个可放置的兄弟姐妹,并将其放置在彼此之上

    我正在尝试创建多个彼此相邻的 jquery droppable 其中某些部分可能重叠 在这些情况下 我希望位于顶部 z 索引明智 的那个是贪婪的 我尝试过设置greedy truedroppable 中的选项 但这似乎没有帮助 我也尝试过r
  • 调试时会忽略依赖项 org.json:json:20090211,因为它可能与 Android 提供的内部版本冲突

    当我运行 android studio 时 出现以下警告 调试时会忽略依赖项 org json json 20090211 因为它可能与 Android 提供的内部版本冲突 如果出现问题 请用jarjar重新打包更改类包 我该如何解决这个错
  • 合并多个文件的 MD5 哈希值

    我有 7 个文件要为其生成 MD5 哈希值 哈希值用于确保数据存储的远程副本与本地副本相同 不幸的是 这两个数据副本之间的链接速度非常慢 数据的更改非常罕见 但我要求数据始终 或尽快 同步 我不想通过我的 非常慢的 通信链路传递 7 个不同
  • Entity Framework Oracle 和 Sql Server - 如何构建独立于数据库的应用程序

    我们正在尝试构建一个同时使用 Oracle 和 SQL Server 的数据访问层 不同时 我们使用 EF Model first 来创建模型并创建用于构建数据库的 SQL 脚本 我们的第一个想法是创建 2 个 EDMX 文件 每种类型一个
  • 为什么 Go HTTPS 客户端不重用连接?

    我有一个 http 客户端 它创建与主机的多个连接 我想设置它可以设置到特定主机的最大连接数 go的request Transport中没有这样的选项 我的代码看起来像 package main import fmt net http ne