为什么net.DialTimeout一半的时候会超时?

2024-04-21

这是我的测试代码,我设置了6s超时,但是程序只执行了3s,为什么?

package main

import "net"
import "time"
import "fmt"

func main() {
    fmt.Println(time.Now())
    conn, err := net.DialTimeout("tcp", "google.com:80",6*time.Second) // chinese people can't access google
    fmt.Println(time.Now())
    fmt.Println(conn,err)
}

测试结果:

2016-05-18 16:21:31.325340213 +0800 CST
2016-05-18 16:21:34.32909193 +0800 CST
<nil> dial tcp 59.24.3.173:80: i/o timeout

您的代码没问题,但您的网络/互联网连接/互联网路由有问题。
例如,如果您和谷歌之间的路由器/设备过载(或任何问题......),我猜它可能每隔几秒就会丢弃一些数据包。

我的测试结果:

10 192.0109ms 3 &{{0xc082082900}} <nil>
9 192.0109ms 3 &{{0xc082082780}} <nil>
8 192.0109ms 3 &{{0xc082082000}} <nil>
7 197.0112ms 3 &{{0xc082015c80}} <nil>
6 227.0129ms 3 &{{0xc082082300}} <nil>
5 372.0212ms 3 &{{0xc082082180}} <nil>
4 375.0214ms 0 &{{0xc082015e00}} <nil>
3 375.0214ms 3 &{{0xc082082600}} <nil>
2 375.0214ms 3 &{{0xc082082480}} <nil>
1 378.0216ms 3 &{{0xc082082a80}} <nil>

然后我禁用了网络连接:

10 1.0000572s 0 <nil> dial tcp: i/o timeout
9 1.0000572s 3 <nil> dial tcp: i/o timeout
8 1.0000572s 3 <nil> dial tcp: i/o timeout
7 1.0000572s 3 <nil> dial tcp: i/o timeout
6 1.0000572s 4 <nil> dial tcp: i/o timeout
5 1.0000572s 4 <nil> dial tcp: i/o timeout
4 1.0000572s 4 <nil> dial tcp: i/o timeout
3 1.0000572s 4 <nil> dial tcp: i/o timeout
2 1.0000572s 4 <nil> dial tcp: i/o timeout
1 1.0000572s 4 <nil> dial tcp: i/o timeout

具有 10 个并发测试的测试示例代码:

package main

import (
    "fmt"
    "net"
    "time"
)

type res struct {
    d time.Duration
    t int64
    n net.Conn
    e error
}

func check(c chan res) {
    t := time.Now()
    conn, err := net.DialTimeout("tcp", "google.com:80", 1*time.Second)
    d := time.Now().Sub(t)
    c <- res{d, (t.UnixNano() - t0) / time.Millisecond.Nanoseconds(), conn, err}
}

var t0 int64 = time.Now().UnixNano()

func main() {
    numberOfJobs := 10
    c := make(chan res, numberOfJobs)
    for i := 0; i < numberOfJobs; i++ {
        go check(c)
    }
    for r := range c {
        fmt.Println(numberOfJobs, r.d, r.t, r.n, r.e)
        numberOfJobs--
        if numberOfJobs == 0 {
            break
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么net.DialTimeout一半的时候会超时? 的相关文章

  • GO Websocket 向所有客户端发送消息

    这段代码一切正常 为了更好的阅读而缩短了它 When Client1向服务器发送请求 服务器立即响应他 但是 其他客户端看不到响应消息 所以我想更进一步 当客户端向服务器发送请求时 服务器会响应所有客户端 以便所有客户端都可以看到该消息 我
  • Golang 结构继承没有按预期工作?

    查看这个沙箱 https play golang org p elIHgHAZjT 声明从不同结构继承的结构时 type Base struct a string b string type Something struct Base c
  • 指定共享对象(共享库)的名称

    Go 编译器为共享对象生成的名称是错误的 例子 go install buildmode shared linkshared github com apache thrift lib go thrift code google com p
  • 记录到 golang 中的文件

    我从 golang 开始 当我开始构建我的应用程序时 我想从一开始就添加日志记录 这就是我遇到问题的地方 如果我打开一个文件并使用标准日志记录库 我就可以写入文件 就像这样 package main import os fmt log fu
  • 如何列出已安装的 go 软件包

    据我所知go distribution带有某种package manager After go 1 4 1我已经运行的安装go help为了找到任何能够列出本地安装的子命令go packages 但不幸的是没有 那么该怎么做呢 goinst
  • 如何展平嵌套 JSON

    尝试将嵌套的 json 响应从 2 层深度压平到 1 层 这是我在 Go Playground 上的工作代码 http play golang org p kHAYuZUTko http play golang org p kHAYuZUT
  • 为什么这里会出现僵局

    我想了解 golang 通道是如何工作的 我读了一本关于go语言的书 发现了下面的例子 package main import fmt Send the sequence 2 3 4 to returned channel func gen
  • 将 Base64 字符串转换为 JPG

    我正在得到图像为 base64 字符串 dataurl 下面是我的函数 它将dataurl进入图像 现在 如果图像是 png 则 png 库将创建图像 而 jpg 库将引发错误 反之亦然 问题是当我上传 png 时效果很好 但是当我上传 j
  • 如何获取变量的内存大小?

    有谁知道如何获取变量的内存大小 int string struct等 并打印它 是否可以 var i int 1 I want to get something like this fmt Println Size of i is i Al
  • 如何获取字段类型的零值

    我有一个包含许多字段的结构 我已经弄清楚如何使用反射提取字段名称 值和标签信息 我还想做的是确定字段的值是否与字段的默认值不同 目前 我有这个 有效 但有点臭 qsMap make map string interface var defa
  • 按顺序范围循环映射

    我正在寻找一种确定的方法来范围Go map为了 Go 规范 https golang org ref spec For statements陈述如下 映射的迭代顺序未指定 并且不保证从一次迭代到下一次迭代的顺序相同 如果在迭代过程中删除尚未
  • 如何更新任意go结构的所有字符串字段?

    我尝试编写一个函数来更新所有字符串字段随意的结构体 像这样 type Student struct Name string Age int func SetStringField obj interface reflect ValueOf
  • 为什么 golang 堆配置文件中的“Total MB”小于顶部的“RES”?

    我有一个用 go 编写的服务 在运行时需要 6 7G 内存 RES 在顶部 所以我使用 pprof 工具试图找出问题所在 go tool pprof pdf http
  • 如何更改“go build”的库路径

    我正在尝试与 goncurses 一起工作 在 Centos 6 上 ncurses 库很旧 5 7 想要 5 9 所以我从源代码构建了 ncurses 并将其安装到 usr lib usr include 等中 如何告诉 go get 针
  • 在 Go 中获取机器 epsilon 的最简单方法

    在 Go 中获取机器 epsilon 的最简单方法是什么 浮点数的其他方面 例如精度 最小指数 最大指数 摆动等 又如何呢 我意识到有一个 math const 包 其中包含不同浮点类型的最大值和最小值 http golang org sr
  • 地图中的最大元素数

    GO 中的 Map 最多可以存储多少个元素 如果我需要经常从 Map 访问数据 那么在长时间运行的程序中不断向 Map 添加项目并从中检索项目是一个好主意吗 除了map length类型的最大值之外 map中的元素数量没有理论上的限制 in
  • 如果覆盖率低于一定百分比,则单元测试失败

    我制作了一个执行的 makefilego test cover 是否有可能失败make unit tests如果覆盖范围低于 X 则命令 我该怎么做呢 您可以使用TestMain在你的测试中做到这一点 TestMain 可以充当测试的自定义
  • 将具有联合字段的 C 结构映射到 Go 结构

    我从 Go 中的某些 WinApi 的系统调用中获取结果 我可以轻松地从 C 代码映射简单的结构 但是如何处理如下所示的 C 结构 typedef struct SPC LINK DWORD dwLinkChoice define SPC
  • 为什么我不能执行 fmt.Sprintf("%d.%d.%d.%d", a...)?

    我正在学习 Go 但我一直坚持 Go 之旅 exercise stringer go https tour golang org methods 7 https tour golang org methods 7 这是一些代码 type I
  • Golang delve,如何启动调试器并启动正在调试的应用程序?

    我正在尝试设置一个可以远程连接的无头深度调试器 我无法找到一种方法来启动调试服务器 而该服务器不会暂停我正在调试的应用程序 我一直在使用dlv attach headless true listen 2345 attach 32但这会暂停该

随机推荐

  • 在 PHP 中生成 wav 音调

    我想在 php 中生成正弦音 但是构建我的 wav 时我需要给出以字节为单位的值 我不知道该怎么做 这是我的代码 freqOfTone 440 sampleRate 44100 samplesCount 80000 amplitude 0
  • 如何启动已停止的线程

    我创建一个新线程并从主线程启动它 m MyThread new Thread HandleMyThread m MyThread IsBackground true m MyThread Start private void HandleM
  • 虾表设置标题行背景色

    pdf table header row1 row2 width 490 cell style size 7 align center do style row 0 padding 4 2 font Prawn BASEDIR data f
  • 在 Oracle 计算实例 (ubuntu-20.04) 上打开端口 19132

    我创建了一个运行 Ubuntu 20 04 的 Oracle 云基础设施计算实例 我正在尝试打开端口 19132 根据我发现的另一个问题在 Oracle Cloud Infrastructure 计算节点上打开端口 80 https sta
  • Mac 终端 - 打开终端时出现“释放的指针未分配”错误

    在 mac 上打开终端时收到以下消息 上次登录 3 月 11 日星期二 14 33 24 在控制台上 登录 291 0x7fff78af9310 malloc 对象 0x7f974be006f0 的错误 正在释放的指针未分配 在malloc
  • 映射服务使用的网络驱动器

    假设某些 Windows 服务使用需要映射网络驱动器且不需要 UNC 路径的代码 当服务启动时 如何使驱动器映射可供服务会话使用 以服务用户身份登录并创建持久映射不会在实际服务的上下文中建立映射 使用此功能需要您自担风险 我已经在XP和Se
  • Java - 堆与直接内存访问

    我最近遇到sun misc Unsafe类 允许用户以类似于 C 的方式分配 解除分配和一般访问内存 我读过一些解决这个问题的博客 例如 堆内存和直接内存哪个更快 http mentablog soliveirajr com 2012 11
  • 如何在功能测试中测试电子邮件(Symfony2)

    我正在尝试在功能测试中测试电子邮件 我的源代码是一样的食谱的例子 http symfony com doc current cookbook email testing html 控制器 public function sendEmailA
  • PySpark 中按降序排序

    我正在使用 PySpark Python 2 7 9 Spark 1 3 1 并有一个数据框 GroupObject 我需要按降序过滤和排序 试图通过这段代码来实现它 group by dataframe count filter coun
  • 使用 F# 的爱因斯坦之谜解决方案 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在找爱因斯坦之谜 http en
  • 将最后一个值替换为之前的值

    我有一组不完整的三元组 a np arange 10 3 1 print a 1 1 1 2 2 2 3 3 3 4 Or a1 np arange 11 3 1 print a1 1 1 1 2 2 2 3 3 3 4 4 最后的值为4
  • 是否可以让 valgrind 忽略某些库?

    或者最好是全部而不只是我的代码 我的程序使用 Gtk Loudmouth 和其他一些东西 而这两个 以及它们背后的一些 libgcrypto libssl 本身导致了如此多的错误 以至于我无法检测到我自己的错误 是否有可能让 valgrin
  • 适用于多个项目的多个 Rails 版本

    我想在一个项目中使用 Rails 2 2 2 在另一个项目中使用 Rails 2 3 2 两者均已安装 What is rails 2 2 2 version应该做的 我读到它使 2 2 2 成为工作版本 也就是说 从那时起将使用的版本 但
  • 当我使用 gridview:true 时, afterInsertRow : function(ids) 方法不执行

    当我设定gridview to true gridview true 在我们的jqGrid中增加jqGrid的性能 方法如下插入行后 或者其他类似的方法不被执行 以下是我的jgGrid的代码 jQuery displaylistGrid j
  • C#中的foreach是如何实现的? [复制]

    这个问题在这里已经有答案了 究竟是怎样的foreach在 C 中实现 我想象它的一部分看起来像 var enumerator TInput GetEnumerator while enumerator MoveNext do some st
  • VS 2015 命令提示符中不再找到 rc.exe

    我刚刚安装了 Windows 10 创意者更新 版本 10 0 15063 我安装了多个版本的 Visual Studio 2012 2013 2015 和 2017 我几周前才安装了 VS 2017 Problem CMake 版本 3
  • Flash 点击时不打开链接

    我用 Flash 创建了这个横幅 我需要单击它来打开一个网页 我使用了这个 Actionscript 3 0 代码 link btn addEventListener MouseEvent CLICK openurl function op
  • 为什么无法使用 CentOS、plesk 9.2.1 和 tomcat 5.5 安装 solr 1.3.0?

    好吧 我只是通过他的托管提供商为我的客户设置了一个专用服务器 他们在那里安装了 plesk 版本 9 2 1 并且该专用服务器的一个警告是 如果我在控制面板之外 即使用 SSH 执行任何任务 他们不保证支持该软件组件 这很好 因为我宁愿使用
  • ScrollPane删除节点时跳转到顶部

    我有一个ScrollPane含有一个TilePane显示图像 每当我删除其中一张图像时ScrollPane跳回到顶部 这在尝试删除多个图像时非常烦人 有没有办法控制滚动行为 我在 Windows 7 上运行此代码 import javafx
  • 为什么net.DialTimeout一半的时候会超时?

    这是我的测试代码 我设置了6s超时 但是程序只执行了3s 为什么 package main import net import time import fmt func main fmt Println time Now conn err