Sobes.tech
Junior — Middle

Kā realizēt drošu datu lasīšanu no kanāla vairākās goroutine vienlaikus?

sobes.tech AI

Atbilde no AI

Go valodā, lai droši lasītu no kanāla vairākās gorutīnās vienlaikus, parasti izmanto vienu no šiem pieejas veidiem:

  1. Viens sūtītājs, vairāki saņēmēji — tiek izveidots kanāls, un vairāki gorutīnas lasa no tā. Go kanāls ir drošs vienlaicīgai lasīšanai no vairākiem gorutīnām, tāpēc ir pietiekami palaist vairākas gorutīnas, kas lasa no viena kanāla.

  2. sync.WaitGroup izmantošana sinhronizācijai — lai gaidītu, kamēr visas gorutīnas pabeigs darbu.

Piemērs:

package main

import (
    "fmt"
    "sync"
)

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

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

    // Sākam 3 gorutīnas, kas lasa no kanāla
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(i, ch, &wg)
    }

    // Sūta datus uz kanāla
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch) // Aizveram kanālu, lai gorutīnas varētu pabeigt darbu

    wg.Wait() // Gaidām, kamēr visas gorutīnas pabeigs darbu
}

Tādējādi, Go kanāls jau nodrošina drošu piekļuvi, lasot no vairākām gorutīnām, galvenais ir pareizi pārvaldīt to dzīves ciklu un aizvērt kanālu.