Junior — Middle
Kuidas rakendada turvalist andmete lugemist kanalist mitme goroutine'i kaudu samal ajal?
sobes.tech AI
Vastus AI-lt
Go keeles, et turvalise kanali lugemiseks mitme goroutine'i poolt samaaegselt, kasutatakse tavaliselt ühte järgmistest lähenemistest:
-
Üks saatja, mitu vastuvõtjat — kanal luuakse ja mitu goroutine'i loevad sellest. Go kanal on turvaline samaaegseks lugemiseks mitme goroutine'i poolt, seega saab lihtsalt käivitada mitu goroutine'i, mis loevad ühest kanalist.
-
sync.WaitGroupkasutamine sünkroniseerimiseks — et oodata, kuni kõik goroutine'id lõpetavad.
Näide:
package main
import (
"fmt"
"sync"
)
func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for val := range ch {
fmt.Printf("Tööline %d sai %d\n", id, val)
}
}
func main() {
ch := make(chan int)
var wg sync.WaitGroup
// Käivitame 3 goroutine'i, mis loevad kanalist
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, ch, &wg)
}
// Saadame andmed kanalile
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) // Kanal suletakse, et goroutine'id lõpetaksid
wg.Wait() // Ootame, kuni kõik goroutine'id lõpetavad
}
Sellisel viisil tagab Go kanal juba turvalise juurdepääsu mitme goroutine'i lugemisel, oluline on nende elutsükli õigesti juhtimine ja kanali sulgemine.