Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 按时间顺序执行例行程序_Go_Goroutine - Fatal编程技术网

Go 按时间顺序执行例行程序

Go 按时间顺序执行例行程序,go,goroutine,Go,Goroutine,这段代码的目的是使用go例程计算我的电脑和google.com之间的每次连接时间。但结果似乎是错误的。为什么时间不断增加。这是怎么回事 2013/12/04 16:10:41 www.google.com 597.175072ms 2013/12/04 16:10:41 www.google.com 608.161898ms 2013/12/04 16:10:41 www.google.com 614.527441ms 2013/12/04 16:10:41 www.google.com 620

这段代码的目的是使用go例程计算我的电脑和google.com之间的每次连接时间。但结果似乎是错误的。为什么时间不断增加。这是怎么回事

2013/12/04 16:10:41 www.google.com 597.175072ms

2013/12/04 16:10:41 www.google.com 608.161898ms

2013/12/04 16:10:41 www.google.com 614.527441ms

2013/12/04 16:10:41 www.google.com 620.51907ms

2013/12/04 16:10:41 www.google.com 630.052257ms

2013/12/04 16:10:42 www.google.com 654.539717ms

2013/12/04 16:10:42 www.google.com 659.144724ms

2013/12/04 16:10:42 www.google.com 1.28223659s

2013/12/04 16:10:42 www.google.com 1.353469764s

package main

import (
    "log"
    "net"
    "net/http"
    "time"
    "sync"
)

var wg sync.WaitGroup

func main() {
    url := "http://www.google.com"
    for i := 0; i < 9; i++ {

        wg.Add(1)
        go request(url)
    }
    wg.Wait()
}

func dialTimeout(network, addr string) (net.Conn, error) {
    return net.DialTimeout(network, addr, time.Duration(1*time.Second))
}

func request(url string) {

    var t0, t1 time.Time

    transport := http.Transport{
        Dial: dialTimeout,
    }

    client := http.Client{
        Transport: &transport,
    }
    t0 = time.Now()
    _, err := client.Get(url)
    t1 = time.Now()
    if err != nil {
        log.Println(err)
    }
    log.Println(url +" "+ t1.Sub(t0).String())
    wg.Done()
}
主程序包
进口(
“日志”
“净额”
“net/http”
“时间”
“同步”
)
var wg sync.WaitGroup
func main(){
url:=”http://www.google.com"
对于i:=0;i<9;i++{
工作组.添加(1)
go请求(url)
}
wg.Wait()
}
func拨号超时(网络,地址字符串)(net.Conn,错误){
返回网络拨号超时(网络、地址、时间持续时间(1*时间秒))
}
func请求(url字符串){
变量t0,t1时间。时间
传输:=http.transport{
拨号:拨号超时,
}
客户端:=http.client{
运输:&运输,
}
t0=时间。现在()
_,err:=client.Get(url)
t1=时间。现在()
如果错误!=零{
log.Println(错误)
}
log.Println(url+“”+t1.Sub(t0.String())
wg.Done()
}

也许这就是原因:您的代码是一种将10次连接时间从最快到最慢排序的聪明方法。每次goroutine完成后都会打印所需的时间,因此稍后会打印更长的连接。由于所有连接基本上都是在同一时刻开始的,您会看到“连接时间在增加”,但没有任何东西在增加,最慢的只是速度慢,并在最后打印


显示效果。

不确定goroutines是否是问题所在。也许是网络?如果你开始敲打他们的服务,甚至谷歌也会做一些速率限制?不仅仅是谷歌,我还尝试了localhost,同样的结果是连接在某个点被序列化?我本以为单独的传输意味着单独的连接,但也许它发生在另一层?但我仍然不认为代码是错误的。将网络访问替换为随机休眠显示了预期的行为,请参阅。所以,正如詹姆斯所说,这一定发生在其他地方。我认为这是Sleepsort的一个变种。