Sobes.tech
Senior

Was sagen Sie dem Interviewer (falls gefragt) "Ich würde einen Worker-Pool mit einer festen Anzahl von Workern, einem Kanal für Aufgaben und sync.WaitGroup verwenden. Die Worker führen die Anfragen aus, und Timeout sowie Abbruch werden über den Kontext gesteuert. Die Ergebnisse sammle ich in einem Puffer, der durch ein Mutex (oder einen separaten Kanal) geschützt ist." Jetzt bist du dran Schreibe den Code in diesem Chat. Ich werde ihn überprüfen und Feedback geben. Wenn du nicht weißt, wo du anfangen sollst, bitte um einen Tipp. Viel Erfolg!

sobes.tech KI

Antwort von AI

go package main

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

// Task stellt eine Aufgabe zur Verarbeitung dar type Task struct { id int // andere Felder }

// WorkerPool implementiert einen Pool von Arbeitern 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 } // Aufgabe verarbeiten res := processTask(task) select { case results <- res: case <-ctx.Done(): return } } } }

func processTask(t Task) string { // Arbeit simulieren time.Sleep(100 * time.Millisecond) return fmt.Sprintf("Ergebnis für Aufgabe %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)
}

// Separater Goroutine zum Schließen des Ergebnis-Kanals nach Abschluss der Worker
go func() {
	wg.Wait()
	close(results)
}()

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

// Ergebnisse sammeln
for res := range results {
	fmt.Println(res)
}

}