Go 按时间顺序执行例行程序
这段代码的目的是使用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.353469764sGo 按时间顺序执行例行程序,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
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的一个变种。