Ką pasakyti interviuotojui (jei paklaus) "Aš naudociau worker pool su fiksuotu darbuotojų skaičiumi, užduočių kanalą ir sync.WaitGroup. Darbuotojai vykdys užklausas, o laiko limitas ir atšaukimas bus kontroliuojami per kontekstą. Rezultatus surinksiu į buferį, apsaugotą mutex (arba per atskirą kanalą)." Dabar tavo eilė Rašyk kodą šiame pokalbyje. Aš jį patikrinsiu ir duosiu atsiliepimų. Jei nežinai nuo ko pradėti, paprašyk patarimo. Sėkmės!
sobes.tech AI
Atsakymas iš AI
go package main
import ( "context" "fmt" "sync" "time" )
// Task reprezentuoja užduotį apdoroti type Task struct { id int // kiti laukai }
// WorkerPool įgyvendina darbuotojų grupę 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 } // Užduoties apdorojimas res := processTask(task) select { case results <- res: case <-ctx.Done(): return } } } }
func processTask(t Task) string { // darbo simuliacija time.Sleep(100 * time.Millisecond) return fmt.Sprintf("rezultatas užduočiai %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)
}
// Atskiras gorutinas užduočių siuntimui
go func() {
for i := 0; i < 20; i++ {
tasks <- Task{id: i}
}
close(tasks)
}()
// Rezultatų rinkimas
for res := range results {
fmt.Println(res)
}
}