Junior — Middle
Bir kanaldan eyni zamanda bir neçə goroutine ilə təhlükəsiz məlumat oxumağı necə həyata keçirmək olar?
sobes.tech Süni İntellekt
AI-dan cavab
Go dilində, eyni vaxtda bir neçə goroutine-dən təhlükəsiz oxumaq üçün adətən aşağıdakı yanaşmalardan biri istifadə olunur:
-
Bir göndərən, bir neçə qəbul edən — kanal yaradılır və bir neçə goroutine ondan oxuyur. Go-dakı kanal çoxsaylı goroutine-lərdən eyni vaxtda oxumağa təhlükəsizdir, ona görə də sadəcə eyni kanaldan oxuyan bir neçə goroutine başlatmaq kifayətdir.
-
sync.WaitGroupistifadə edərək sinxronizasiya — bütün goroutine-lərin tamamlanmasını gözləmək üçün.
Nümunə:
package main
import (
"fmt"
"sync"
)
func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for val := range ch {
fmt.Printf("İşçi %d aldı %d\n", id, val)
}
}
func main() {
ch := make(chan int)
var wg sync.WaitGroup
// 3 goroutine işə salırıq, onlar kanaldan oxuyurlar
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, ch, &wg)
}
// Kanala məlumat göndəririk
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) // Kanalı bağlayırıq, beləliklə goroutine-lər bitir
wg.Wait() // Bütün goroutine-lərin tamamlanmasını gözləyirik
}
Beləliklə, Go-dakı kanal artıq çoxsaylı goroutine-lərdən oxuma zamanı təhlükəsiz giriş təmin edir, əsas odur ki, onların həyat dövrünü düzgün idarə etmək və kanalı bağlamaqdır.