Sobes.tech
Junior — Middle

Kako implementirati sigurnu čitanje podataka iz kanala u više gorutina istovremeno?

sobes.tech АИ

Одговор од АИ

U Go jeziku, za sigurnu čitanje iz kanala od strane više gorutina istovremeno, obično se koriste jedan od sledećih pristupa:

  1. Jedan pošiljalac, više primaoca — kreira se kanal i više gorutina čitaju iz njega. Kanal u Go je siguran za istovremeno čitanje od strane više gorutina, pa je dovoljno pokrenuti više gorutina koje čitaju iz istog kanala.

  2. Korišćenje sync.WaitGroup za sinhronizaciju — da se sačeka završetak svih gorutina.

Primer:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for val := range ch {
        fmt.Printf("Radnik %d primio %d\n", id, val)
    }
}

func main() {
    ch := make(chan int)
    var wg sync.WaitGroup

    // Pokrećemo 3 gorutine koje čitaju iz kanala
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(i, ch, &wg)
    }

    // Šaljemo podatke u kanal
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch) // Zatvaramo kanal da bi gorutine završile

    wg.Wait() // Čekamo da se sve gorutine završe
}

Na ovaj način, kanal u Go već obezbeđuje siguran pristup pri čitanju iz više gorutina, važno je pravilno upravljati njihovim životnim ciklusom i zatvoriti kanal.