Junior — Middle
Jak zaimplementować bezpieczne odczytywanie danych z kanału w wielu goroutines jednocześnie?
sobes.tech AI
Odpowiedź od AI
W Go, aby bezpiecznie czytać z kanału z wielu gorutyn jednocześnie, zwykle stosuje się jedno z następujących podejść:
-
Jeden nadawca, wielu odbiorców — kanał jest tworzony, a kilka gorutyn czyta z niego. Kanał w Go jest bezpieczny do jednoczesnego odczytu z wielu gorutyn, więc można po prostu uruchomić kilka gorutyn, które czytają z tego samego kanału.
-
Użycie
sync.WaitGroupdo synchronizacji — aby oczekiwać na zakończenie wszystkich gorutyn.
Przykład:
package main
import (
"fmt"
"sync"
)
func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for val := range ch {
fmt.Printf("Pracownik %d otrzymał %d\n", id, val)
}
}
func main() {
ch := make(chan int)
var wg sync.WaitGroup
// Uruchamiamy 3 gorutyny czytające z kanału
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, ch, &wg)
}
// Wysyłamy dane do kanału
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) // Zamykamy kanał, aby gorutyny się zakończyły
wg.Wait() // Czekamy na zakończenie wszystkich gorutyn
}
W ten sposób, kanał w Go już zapewnia bezpieczny dostęp podczas odczytu z wielu gorutyn, kluczowe jest poprawne zarządzanie ich cyklem życia i zamknięcie kanału.