Junior — Middle
Ինչպե՞ս իրականացնել անվտանգ ընթերցում տվյալներից միաժամանակ մի քանի goroutine-ներում:
sobes.tech AI
Պատասխան AI-ից
Go լեզվում, միաժամանակ մի քանի goroutine-ներից անվտանգ ընթերցման համար սովորաբար օգտագործվում է հետևյալ մոտեցումներից մեկը՝
-
Մեկ ուղարկող, մի քանի ստացող — ստեղծվում է մի ալիք և մի քանի goroutine-ներ ընթերցում են նրանից։ Go-ում ալիքը անվտանգ է միաժամանակ մի քանի goroutine-ներից ընթերցելու համար, այնպես որ կարելի է պարզապես գործարկել մի քանի goroutine-ներ, որոնք ընթերցում են նույն ալիքից։
-
sync.WaitGroupօգտագործում՝ սինխրոնիզացիայի համար — որպեսզի սպասենք բոլոր goroutine-ների ավարտին։
Օրինակ՝
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 goroutine, որոնք ընթերցում են ալիքից
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, ch, &wg)
}
// ուղարկում ենք տվյալներ ալիքին
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) // փակել ալիքը, որպեսզի goroutine-ները ավարտվեն
wg.Wait() // սպասում ենք բոլոր goroutine-ների ավարտին
}
Այսպիսով, Go-ի ալիքը արդեն ապահովում է անվտանգ մուտք գործելիս միաժամանակ մի քանի goroutine-ներից ընթերցելիս, կարևորն այն է, որ ճիշտ կառավարենք նրանց կյանքի ցիկլը և փակենք ալիքը։