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)
}
}