Junior — Middle
Πώς υλοποιείται η ασφαλής ανάγνωση δεδομένων από ένα κανάλι σε πολλαπλές goroutines ταυτόχρονα;
sobes.tech AI
Απάντηση από AI
Στη Go, για ασφαλή ανάγνωση από ένα κανάλι από πολλαπλές goroutines ταυτόχρονα, συνήθως χρησιμοποιούνται μία από τις ακόλουθες προσεγγίσεις:
-
Ένας αποστολέας, πολλαπλοί δέκτες — δημιουργείται ένα κανάλι και πολλαπλές goroutines διαβάζουν από αυτό. Το κανάλι στη Go είναι ασφαλές για ταυτόχρονη ανάγνωση από πολλαπλές goroutines, οπότε μπορείτε απλά να ξεκινήσετε πολλές goroutines που διαβάζουν από το ίδιο κανάλι.
-
Χρήση του
sync.WaitGroupγια συγχρονισμό — για να περιμένετε να ολοκληρώσουν όλες οι goroutines.
Παράδειγμα:
package main
import (
"fmt"
"sync"
)
func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for val := range ch {
fmt.Printf("Εργάτης %d έλαβε %d\n", id, val)
}
}
func main() {
ch := make(chan int)
var wg sync.WaitGroup
// Ξεκινάμε 3 goroutines που διαβάζουν από το κανάλι
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, ch, &wg)
}
// Στέλνουμε δεδομένα στο κανάλι
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) // Κλείνουμε το κανάλι ώστε να τερματίσουν οι goroutines
wg.Wait() // Περιμένουμε να ολοκληρώσουν όλες οι goroutines
}
Έτσι, το κανάλι στη Go ήδη εξασφαλίζει ασφαλή πρόσβαση κατά την ανάγνωση από πολλαπλές goroutines, το κύριο είναι να διαχειριστούμε σωστά τον κύκλο ζωής τους και να κλείσουμε το κανάλι.