为什么net.DialTimeout获得一半的超时时间? [英] Why net.DialTimeout get timeout half of the time?

查看:75
本文介绍了为什么net.DialTimeout获得一半的超时时间?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

This is my test code, I set 6s timeout, but the program execute only for 3s, Why?

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

推荐答案

您的代码正常,您的网络/互联网连接/到互联网的路由有问题.
例如,我想,如果您和Google之间的路由器/设备超载(或任何问题...),它可能每隔几秒钟就会丢掉一些数据包.

Your code is OK, your network/internet connection/route to the internet has problem.
For example if a router/device between you and google overloaded (or any problem...) it may drop some packets every some seconds, my guess.

我的测试结果:

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>

然后我禁用了网络连接:

then I disabled network connection:

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个并发测试的测试样本代码:

the Test Sample Code with 10 Concurrent tests:

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
        }
    }
}

这篇关于为什么net.DialTimeout获得一半的超时时间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆