Τι να πείτε στον συνεντευξιαστή (αν σας ρωτήσουν) "Θα χρησιμοποιούσα ένα pool εργαζομένων με σταθερό αριθμό εργαζομένων, ένα κανάλι για εργασίες και sync.WaitGroup. Οι εργαζόμενοι θα εκτελούν τα αιτήματα, και το timeout και η ακύρωση θα ελέγχονται μέσω του context. Τα αποτελέσματα θα συγκεντρώνονται σε ένα buffer, προστατευμένο από ένα mutex (ή μέσω ενός ξεχωριστού καναλιού)." Τώρα είναι η σειρά σου Γράψε τον κώδικα σε αυτό το chat. Θα τον ελέγξω και θα σου δώσω ανατροφοδότηση. Αν δεν ξέρεις από πού να ξεκινήσεις, ζήτησε μια υπόδειξη. Καλή επιτυχία!
sobes.tech AI
Απάντηση από AI
go package main
import ( "context" "fmt" "sync" "time" )
// Task αντιπροσωπεύει μια εργασία προς επεξεργασία type Task struct { id int // άλλα πεδία }
// WorkerPool υλοποιεί μια ομάδα εργαζομένων 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 } // Επεξεργασία εργασίας res := processTask(task) select { case results <- res: case <-ctx.Done(): return } } } }
func processTask(t Task) string { // προσομοίωση εργασίας time.Sleep(100 * time.Millisecond) return fmt.Sprintf("αποτέλεσμα για την εργασία %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 για το κλείσιμο του καναλιού αποτελεσμάτων μετά την ολοκλήρωση των εργαζομένων
go func() {
wg.Wait()
close(results)
}()
// Αποστολή εργασιών
go func() {
for i := 0; i < 20; i++ {
tasks <- Task{id: i}
}
close(tasks)
}()
// Συλλογή αποτελεσμάτων
for res := range results {
fmt.Println(res)
}
}