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 關注
- 161 瀏覽
添加回答
舉報