Junior — Middle
Kā realizēt drošu datu lasīšanu no kanāla vairākās goroutine vienlaikus?
sobes.tech AI
Atbilde no AI
Go valodā, lai droši lasītu no kanāla vairākās gorutīnās vienlaikus, parasti izmanto vienu no šiem pieejas veidiem:
-
Viens sūtītājs, vairāki saņēmēji — tiek izveidots kanāls, un vairāki gorutīnas lasa no tā. Go kanāls ir drošs vienlaicīgai lasīšanai no vairākiem gorutīnām, tāpēc ir pietiekami palaist vairākas gorutīnas, kas lasa no viena kanāla.
-
sync.WaitGroupizmantošana sinhronizācijai — lai gaidītu, kamēr visas gorutīnas pabeigs darbu.
Piemērs:
package main
import (
"fmt"
"sync"
)
func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for val := range ch {
fmt.Printf("Darbinieks %d saņēma %d\n", id, val)
}
}
func main() {
ch := make(chan int)
var wg sync.WaitGroup
// Sākam 3 gorutīnas, kas lasa no kanāla
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, ch, &wg)
}
// Sūta datus uz kanāla
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) // Aizveram kanālu, lai gorutīnas varētu pabeigt darbu
wg.Wait() // Gaidām, kamēr visas gorutīnas pabeigs darbu
}
Tādējādi, Go kanāls jau nodrošina drošu piekļuvi, lasot no vairākām gorutīnām, galvenais ir pareizi pārvaldīt to dzīves ciklu un aizvērt kanālu.