Sobes.tech
Middle+

ვაზიფიკა: „პარალელური URL-ების დამუშავება დროის შეზღუდვით“ დაწერეთ ფუნქცია fetchAll(urls []string, maxParallel int, timeout time.Duration) map[string]string, რომ: 1. თითოეულ URL-ისთვის ახორციელებს HTTP GET მოთხოვნას (შესაძლებელია http.Get-ის გამოყენება). 2. აბრუნებს map[string]string, სადაც გასაღებია URL, მნიშვნელობა კი პასუხის სხეული (სტრინგად) ან ცარიელი სტრინგი შეცდომის/დროის ამოწურვის შემთხვევაში. 3. ერთდროულად არ უნდა შესრულდეს მეტი, ვიდრე maxParallel მოთხოვნა. 4. ფუნქციის საერთო მუშაობის დრო არ უნდა აღემატებოდეს timeout-ს. თუ დრო ამოიწურა, ყველა დასრულებული მოთხოვნა გაჩერებულია, და ფუნქცია აბრუნებს იმას, რაც მიაღწია. 5. გამოიყენეთ კონტექსტი გაუქმებისთვის.

sobes.tech AI

პასუხი AI-სგან

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) // სემაფორი პარალელიზმის შეზღუდვისთვის
var wg sync.WaitGroup

for _, url := range urls {
	select {
	case <-ctx.Done():
		break
	default:
		wg.Add(1)
		sem <- struct{}{} // ადგილი დავიკავეთ

		go func(u string) {
			defer wg.Done()
			defer func() { <-sem }() // თავისუფლება

			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

}