Sobes.tech
Senior

Ce să spui intervievatorului (dacă te întreabă) "Aș folosi un pool de workeri cu un număr fix de workeri, un canal pentru sarcini și sync.WaitGroup. Workeri vor executa cererile, iar timeout-ul și anularea vor fi controlate prin context. Voi aduna rezultatele într-un buffer, protejat de un mutex (sau printr-un canal separat)." Acum e rândul tău Scrie codul în acest chat. Îl voi verifica și îți voi oferi feedback. Dacă nu știi de unde să începi, cere o sugestie. Mult noroc!

sobes.tech AI

Răspuns de la AI

go package main

import ( "context" "fmt" "sync" "time" )

// Task reprezintă o sarcină pentru procesare type Task struct { id int // alte câmpuri }

// WorkerPool implementează un grup de lucrători func WorkerPool(ctx context.Context, tasks <-chan Task, results chan<- string, wg *sync.WaitGroup) { defer wg.Done() for { select { case <-ctx.Done(): return case task, ok := <-tasks: if !ok { return } // Procesarea sarcinii res := processTask(task) select { case results <- res: case <-ctx.Done(): return } } } }

func processTask(t Task) string { // simulare de lucru time.Sleep(100 * time.Millisecond) return fmt.Sprintf("rezultat pentru sarcina %d", t.id) }

func main() { tasks := make(chan Task) results := make(chan string) var wg sync.WaitGroup

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

workerCount := 5
wg.Add(workerCount)
for i := 0; i < workerCount; i++ {
	go WorkerPool(ctx, tasks, results, &wg)
}

// Goroutine separat pentru închiderea canalului de rezultate după terminarea lucrătorilor
go func() {
	wg.Wait()
	close(results)
}()

// Trimiterea sarcinilor
go func() {
	for i := 0; i < 20; i++ {
		tasks <- Task{id: i}
	}
	close(tasks)
}()

// Colectarea rezultatelor
for res := range results {
	fmt.Println(res)
}

}