Senior
Ko teiktu intervētājam (ja viņš jautā) "Es izmantotu worker pool ar fiksētu darba ņēmēju skaitu, uzdevumu kanālu un sync.WaitGroup. Darba ņēmēji veiks pieprasījumus, un laika limitu un atcelšanu kontrolēs konteksts. Rezultātus es savāku buferī, kas ir aizsargāts ar mutex (vai caur atsevišķu kanālu)." Tagad ir tava kārta Raksti kodu šajā čatā. Es to pārbaudīšu un sniegšu atsauksmi. Ja nezināji, ar ko sākt, lūdz padomu. Veiksmi!
sobes.tech AI
Atbilde no AI
go package main
import ( "context" "fmt" "sync" "time" )
// Task pārstāv uzdevumu apstrādei type Task struct { id int // citi lauki }
// WorkerPool īsteno darba grupu 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 } // Uzdevuma apstrāde res := processTask(task) select { case results <- res: case <-ctx.Done(): return } } } }
func processTask(t Task) string { // darba simulācija time.Sleep(100 * time.Millisecond) return fmt.Sprintf("rezultāts uzdevumam %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)
}
// Atsevišķa gorutina rezultātu kanāla aizvēršanai pēc darba grupas beigām
go func() {
wg.Wait()
close(results)
}()
// Uzdevumu sūtīšana
go func() {
for i := 0; i < 20; i++ {
tasks <- Task{id: i}
}
close(tasks)
}()
// Rezultātu apkopošana
for res := range results {
fmt.Println(res)
}
}