Wat te zeggen tegen de interviewer (als ze vragen) "Ik zou een worker pool gebruiken met een vast aantal workers, een kanaal voor taken en sync.WaitGroup. De workers zullen de verzoeken uitvoeren, en timeout en annulering worden via de context geregeld. Ik verzamel de resultaten in een buffer, beschermd door een mutex (of via een aparte kanaal)." Nu is het jouw beurt Schrijf de code in deze chat. Ik zal het controleren en feedback geven. Als je niet weet waar je moet beginnen, vraag dan om een hint. Succes!
sobes.tech AI
Antwoord van AI
go package main
import ( "context" "fmt" "sync" "time" )
// Task vertegenwoordigt een taak om te verwerken type Task struct { id int // andere velden }
// WorkerPool implementeert een pool van werkers 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 } // Verwerking van taak res := processTask(task) select { case results <- res: case <-ctx.Done(): return } } } }
func processTask(t Task) string { // simulatie van werk time.Sleep(100 * time.Millisecond) return fmt.Sprintf("resultaat voor taak %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)
}
// Apart goroutine om resultaat kanaal te sluiten na voltooiing van de workers
go func() {
wg.Wait()
close(results)
}()
// Taken verzenden
go func() {
for i := 0; i < 20; i++ {
tasks <- Task{id: i}
}
close(tasks)
}()
// Resultaten verzamelen
for res := range results {
fmt.Println(res)
}
}