在 Go 中跟踪 HTTP 请求时指定超时

2024-05-12

我知道通过执行以下操作来指定 HTTP 请求超时的常用方法:

httpClient := http.Client{
    Timeout: time.Duration(5 * time.Second),
}

但是,我似乎不知道在跟踪 HTTP 请求时如何执行相同的操作。这是我正在使用的代码片段:

func timeGet(url string) (httpTimingBreakDown, error) {
    req, _ := http.NewRequest("GET", url, nil)

    var start, connect, dns, tlsHandshake time.Time
    var timingData httpTimingBreakDown
    timingData.url = url

    trace := &httptrace.ClientTrace{
        TLSHandshakeStart:    func() { tlsHandshake = time.Now() },
        TLSHandshakeDone:     func(cs tls.ConnectionState, err error) { timingData.tls = time.Since(tlsHandshake) },
    }

    req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
    start = time.Now()

    http.DefaultTransport.(*http.Transport).ResponseHeaderTimeout = time.Second * 10 // hacky way, worked earlier but don't work anymore

    if _, err := http.DefaultTransport.RoundTrip(req); err != nil {
        fmt.Println(err)
        return timingData, err
    }

    timingData.total = time.Since(start)

    return timingData, nil
}

我在 goroutine 中触发这个函数。我的示例数据集是 100 个 url。所有 goroutine 都会触发,但最终程序会在 30 秒以上结束,就好像超时是 30 秒一样。

早些时候,我通过使用 hacky 方法将其内部默认值更改为 10 秒,以及任何花费太长时间、超时且程序在 10.xxx 秒结束但现在需要 30.xx 秒的方法来实现相同的工作。

在这种情况下指定超时的正确方法是什么?


我知道通过执行以下操作来指定 HTTP 请求超时的常用方法:

httpClient := http.Client{
    Timeout: time.Duration(5 * time.Second),
}

实际上,首选方法是使用上下文.上下文 https://golang.org/pkg/context/根据要求。您使用的方法只是适合简单用例的捷径。

req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
    return nil, err
}
ctx, cancel := context.WithTimeout(context.Background(), 5 * time.Second)
defer cancel()
req = req.WithContext(ctx)

这种方法也应该很适合您的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Go 中跟踪 HTTP 请求时指定超时 的相关文章

随机推荐

  • 我可以使用 Facebook Graph API 将照片上传到属于粉丝(公司)页面墙的墙吗?

    我需要知道是否可以使用图形 API 将照片上传到公司的粉丝页面 到墙上 另外 一旦用户获得授权 是否可以通过 api 成为公司页面 成为粉丝 是的你可以 您需要使用 Graph API 浏览器 https developers facebo
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • 附件名称编码失败

    我尝试发送一封带有附件的电子邮件 pdf 文件 但收件人收到的文件名称不同且没有 pdf 结尾 该文件的名称是希腊语 try MimeMessage message new MimeMessage session message setFr
  • 在 IntelliJ IDE 中找不到 Maven 插件

    我的项目中有一个新错误 位于 pom xml 文件中 我该如何修复它 IntelliJ IDEA中出现如下错误 Plugin org springframework boot spring boot maven plugin not fou
  • 何时使用属性而不是函数

    这可能是个人喜好的问题 但是什么时候在代码中使用属性而不是函数 例如 要获取错误日志 我可以说 string GetErrorLog return m ErrorLog 或者我可以 string ErrorLog get return m
  • PetaPOCO 和超过 4 个加入

    petapoco 是否能够实现以下目标 1 一次查询无限连接 2 一次查询无限的一对多关系 我查看了 PetaPOCO 它似乎无法执行超过 4 个连接 最长的签名如下所示 db Query 似乎它也支持一对多关系 但仅适用于一个复合对象 如
  • python sympy 中没有指数的解决方案

    当我运行这个程序时 我最终没有得到解决方案 但应该有一个解决方案 我相信 知道我做错了什么吗 如果你从 e2 方程中去掉 Q 它似乎可以正常工作 usr bin python from sympy import a b w r symbol
  • 需要帮助在 JavaScript 中过滤数组

    这是我在 JavaScript 中的数组 let myArray Bob Katy Bob Bob Katy 我想通过检查来过滤这个数组如果当前值等于其后或之前的值 我不太确定如何实现这一目标 但是 有人能给我指出一个方向吗 现在我知道如何
  • 将不同类型的对象与可比较的对象进行比较

    A java public class A implements Comparable private String id private String name public A String a String b id a name b
  • 使用父对象引用进行 XML 反序列化

    我有一个描述网站的 XML 文件 它由站点作为根节点组成 可以有页面 页面可以有按钮或文本框和对话框等对象 对话框也可以有对象 在相应的C 类中 全部派生自Element 当我反序列化 XML 时 如何才能引用正在构造的元素的父级 我被告知
  • Docker Toolbox (Windows):无效的卷规范

    配置 使用 Windows 10 Docker 工具箱 not原生 Docker 以便能够使用虚拟机 背景 有一个 Python 2 7 脚本应该运行 Docker 容器 代码如下所示 self docker containers run
  • Symfony2:twig 中的 form_widget 调用抛出异常“可捕获的致命错误......必须是 Symfony\Component\Form\FormView 的实例”

    当我在控制器操作中创建一个表单时 如下所示 form this gt createFormBuilder gt add field name gt getForm return array form gt form 我尝试在树枝模板中渲染此
  • webgl中绑定缓冲区的逻辑是什么?

    有时我发现自己在以不同顺序声明缓冲区 使用 createBuffer bindBuffer bufferdata 和在代码的其他部分 通常在绘制循环中 重新绑定它们之间挣扎 如果我在绘制数组之前不重新绑定顶点缓冲区 控制台会抱怨尝试访问超出
  • 将 XML 数据提取到 php [重复]

    这个问题在这里已经有答案了 我正在尝试从 XML 文件中提取数据 http freegeoip net xml google com http freegeoip net xml google com 您可以看到该文件的内容类似于
  • 如何使用 pytorch 同时迭代两个数据加载器?

    我正在尝试实现一个接收两张图像的暹罗网络 我加载这些图像并创建两个单独的数据加载器 在我的循环中 我想同时遍历两个数据加载器 以便我可以在两个图像上训练网络 for i data in enumerate zip dataloaders1
  • PHP if in_array 表示多个值

    我有一个由 3 到 12 个值之间的任意位置生成的数组 它根据帐户信息生成该数组 result ad gt user gt groups user username 我想检查这个数组是否有多个值 大约 4 或 5 个 如果其中有任何一个值
  • 使用 EAR 与 WAR 相比有何优势?

    我们正在 Wildfly 8 上部署 JavaEE 7 应用程序 之前 我们已将所有企业应用程序 WAR 多个 EJB JAR 文件 打包为 EAR 然而 现在 JavaEE 允许您将 EJB 打包在 WAR 文件中 或者作为 WAR 的
  • 由于合并而不允许 git revert 但未给出 -m 选项

    我正在尝试使用 revert 命令恢复到 git 中的某个 哈希 号 我正在使用以下命令 git revert c14609d74eec3ccebafc73fa875ec58445471765 但是 我得到以下返回 错误 提交 c14609
  • SQL:将现有列设置为 MySQL 中的主键

    我有一个包含 3 列的数据库 id name somethingelse 该表没有设置索引 我收到 未定义索引 在 phpmyadmin 中id 是一个 7 位字母数字值 每行都是唯一的 我想将 Drugid 设置为主键 索引 我不知道有没
  • 在 Go 中跟踪 HTTP 请求时指定超时

    我知道通过执行以下操作来指定 HTTP 请求超时的常用方法 httpClient http Client Timeout time Duration 5 time Second 但是 我似乎不知道在跟踪 HTTP 请求时如何执行相同的操作