Назад к вопросам
Middle+
6
func FetchAll(ctx context.Context, urls []string, concurrency int) ([]Result, error) { // Твой код здесь return nil, nil }
Компании, где спрашивали
X5
Ответ от нейросети
sobes.tech AI
go func FetchAll(ctx context.Context, urls []string, concurrency int) ([]Result, error) { type resultWithError struct { res Result err error }
results := make([]Result, len(urls))
ch := make(chan resultWithError)
sem := make(chan struct{}, concurrency) // ограничение по concurrency
for i, url := range urls {
select {
case <-ctx.Done():
return nil, ctx.Err()
case sem <- struct{}{}: // занять слот
}
go func(i int, url string) {
defer func() { <-sem }() // освободить слот
res, err := Fetch(ctx, url) // предполагается функция Fetch
ch <- resultWithError{res, err}
}(i, url)
}
for i := 0; i < len(urls); i++ {
select {
case <-ctx.Done():
return nil, ctx.Err()
case r := <-ch:
if r.err != nil {
return nil, r.err
}
results[i] = r.res
}
}
return results, nil
}
Этот код запускает до `concurrency` горутин для параллельного получения данных по URL, используя контекст для отмены. Результаты собираются в срез `results`.