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

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

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