Go с использованием горутин (goroutines) и каналов (channels):
package main
import (
"encoding/csv"
"fmt"
"net/http"
"os"
"sync"
)
const (
apiURL = "https://api.example.com/compare" // Замените на реальный URL API
concurrency = 100 // Количество одновременных запросов
)
func main() {
// Чтение значений из CSV-файла
values, err := readCSV("data.csv") // Замените "data.csv" на путь к вашему CSV-файлу
if err != nil {
fmt.Println("Ошибка чтения CSV:", err)
return
}
var wg sync.WaitGroup
semaphore := make(chan struct{}, concurrency)
for _, value := range values {
wg.Add(1)
go func(v string) {
semaphore <- struct{}{} // Блокировка до доступности слота в семафоре
defer func() {
<-semaphore // Освобождение слота в семафоре
wg.Done()
}()
err := makeAPIRequest(v)
if err != nil {
fmt.Printf("Ошибка запроса для значения %s: %s\n", v, err)
}
}(value)
}
wg.Wait()
fmt.Println("Все запросы выполнены.")
}
func readCSV(filename string) ([]string, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
reader := csv.NewReader(file)
records, err := reader.ReadAll()
if err != nil {
return nil, err
}
var values []string
for _, record := range records {
values = append(values, record[0]) // Предполагается, что значения находятся в первом столбце CSV
}
return values, nil
}
func makeAPIRequest(value string) error {
// Создание HTTP-запроса к внешнему API
req, err := http.NewRequest(http.MethodGet, apiURL, nil)
if err != nil {
return err
}
// Добавление параметров запроса
q := req.URL.Query()
q.Add("value", value) // Замените на реальные параметры запроса
req.URL.RawQuery = q.Encode()
// Отправка запроса
client := http.Client{}
_, err = client.Do(req)
if err != nil {
return err
}
return nil
}