Sobes.tech
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:

  1. 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.

  2. sync.WaitGroup istifadə 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.