Middle+
Görev: «Zaman sınırlamasıyla URL'lerin paralel işlenmesi» Bir fonksiyon yazın fetchAll(urls []string, maxParallel int, timeout time.Duration) map[string]string, bu: 1. Her URL için HTTP GET isteği yapar (http.Get kullanılabilir). 2. Bir map[string]string döndürür, anahtar URL, değer ise yanıt gövdesi (dize olarak) veya hata/zaman aşımı durumunda boş dize. 3. Aynı anda en fazla maxParallel istek yapılır. 4. Fonksiyonun toplam çalışma süresi timeout'u aşmamalıdır. Süre dolarsa, tamamlanmamış tüm istekler iptal edilir ve fonksiyon, ulaşabildiği kadarını döner. 5. İptal için bağlam kullanın.
sobes.tech yapay zeka
AI'dan gelen yanıt
go package main
import ( "context" "io/ioutil" "net/http" "sync" "time" )
func fetchAll(urls []string, maxParallel int, timeout time.Duration) map[string]string { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel()
results := make(map[string]string)
var mu sync.Mutex
sem := make(chan struct{}, maxParallel) // semáforo para limitar o paralelismo
var wg sync.WaitGroup
for _, url := range urls {
select {
case <-ctx.Done():
break
default:
wg.Add(1)
sem <- struct{}{} // reservar um espaço
go func(u string) {
defer wg.Done()
defer func() { <-sem }() // liberar o espaço
req, err := http.NewRequestWithContext(ctx, "GET", u, nil)
if err != nil {
mu.Lock()
results[u] = ""
mu.Unlock()
return
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
mu.Lock()
results[u] = ""
mu.Unlock()
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
mu.Lock()
results[u] = ""
mu.Unlock()
return
}
mu.Lock()
results[u] = string(body)
mu.Unlock()
}(url)
}
}
wg.Wait()
return results
}