2 回答
TA贡献2080条经验 获得超4个赞
你必须resp.Body靠近MakeRequests。
导致错误的另一个问题是您由于错误而尝试访问 StatusCodewhen is nil。resp
这是固定的代码。
func MakeRequests(url string, ch chan<- int, wg *sync.WaitGroup) {
time.Sleep(time.Duration(rand.Intn(10)) * time.Millisecond)
resp, err := http.Get(url)
if resp != nil {
ch <- resp.StatusCode
defer func() {
_, err = io.Copy(ioutil.Discard, resp.Body)
resp.Body.Close()
}()
} else {
ch <- -1 // because main expect exactly totalHit values in ch
}
if err != nil {
fmt.Println(err)
}
wg.Done()
}
TA贡献1828条经验 获得超3个赞
您可以使用以下库:
Requests:一个 Go 库,用于减少发出 HTTP 请求时的麻烦(20k/s 请求)
https://github.com/alessiosavi/Requests
这个想法是分配一个请求列表,然后使用可配置的“并行”因子发送它们,该因子允许一次仅运行“N”个请求。
// This array will contains the list of request
var reqs []requests.Request
// N is the number of request to run in parallel, in order to avoid "TO MANY OPEN FILES. N have to be lower than ulimit threshold"
var N int = 12
// Create the list of request
for i := 0; i < 1000; i++ {
// In this case, we init 1000 request with same URL,METHOD,BODY,HEADERS
req, err := requests.InitRequest("https://127.0.0.1:5000", "GET", nil, nil, true)
if err != nil {
// Request is not compliant, and will not be add to the list
log.Println("Skipping request [", i, "]. Error: ", err)
} else {
// If no error occurs, we can append the request created to the list of request that we need to send
reqs = append(reqs, *req)
}
}
此时,我们有一个包含必须发送的请求的列表。让我们并行发送它们吧!
// This array will contains the response from the givens request
var response []datastructure.Response
// send the request using N request to send in parallel
response = requests.ParallelRequest(reqs, N)
// Print the response
for i := range response {
// Dump is a method that print every information related to the response
log.Println("Request [", i, "] -> ", response[i].Dump())
// Or use the data present in the response
log.Println("Headers: ", response[i].Headers)
log.Println("Status code: ", response[i].StatusCode)
log.Println("Time elapsed: ", response[i].Time)
log.Println("Error: ", response[i].Error)
log.Println("Body: ", string(response[i].Body))
}
您可以在存储库的示例文件夹中找到示例用法。
- 2 回答
- 0 关注
- 125 浏览
添加回答
举报