Вы можете использовать следующую библиотеку:
Запросы : A Go библиотека для уменьшения головной боли при выполнении запросов HTTP (требование 20k / s)
https://github.com/alessiosavi/Requests
Он разработан для решения to many open files
работы с параллельными запросами.
Идея состоит в том, чтобы выделить список запросов, чем отправьте их с настраиваемым «параллельным» фактором, который позволяет одновременно выполнять только «N» запрос.
Инициализировать запросы (у вас уже есть набор URL)
// 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))
}
Вы можете найти пример использования в папке example хранилища.
SPOILER :