【发布时间】:2014-02-26 13:22:17
【问题描述】:
我正在检查服务器的状态。服务器的睡眠时间超过 15 秒,我正在检查超时。
package main
import (
"fmt"
"net/http"
"time"
)
var urls = []string{
"http://site-centos-64:8080/examples/abc1.jsp",
}
type HttpResponse struct {
url string
response *http.Response
err error
}
var ch = make(chan *HttpResponse, 100) // buffered
var count int
func asyncHttpGets(urls []string) []*HttpResponse {
responses := []*HttpResponse{}
count:=0
timeout := make(chan bool, 100)
for i:=0;i<500;i++{
go func(){
for _, url := range urls {
resp, err := http.Get(url)
count++;
go func() {
time.Sleep(1 * time.Second)
timeout <- true
}()
ch <- &HttpResponse{url, resp, err}
if err != nil {
return
}
resp.Body.Close()
}
}()
}
for {
select {
case r := <-ch:
responses = append(responses, r)
if count == 500 {
return responses
}
case <-timeout:
fmt.Println("Timed Out")
if count == 500 {
return responses
}
}
}
return responses
}
func main() {
now:=time.Now()
results := asyncHttpGets(urls)
for _, result := range results {
fmt.Printf("%s status: %s\n", result.url,result.response.Status)
}
fmt.Println( time.Since(now))
}
但是发生的情况是,最初它会打印“超时”,但最后的 150-200 个请求显示它不应该显示的“200 OK”状态。此外,当尝试执行 1000 次时,它会显示“恐慌:运行时错误:无效的内存地址或 nil 指针取消引用”
【问题讨论】: