Sobes.tech
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

}