Sobes.tech
Junior — Middle

Ինչպե՞ս իրականացնել անվտանգ ընթերցում տվյալներից միաժամանակ մի քանի goroutine-ներում:

sobes.tech AI

Պատասխան AI-ից

Go լեզվում, միաժամանակ մի քանի goroutine-ներից անվտանգ ընթերցման համար սովորաբար օգտագործվում է հետևյալ մոտեցումներից մեկը՝

  1. Մեկ ուղարկող, մի քանի ստացող — ստեղծվում է մի ալիք և մի քանի goroutine-ներ ընթերցում են նրանից։ Go-ում ալիքը անվտանգ է միաժամանակ մի քանի goroutine-ներից ընթերցելու համար, այնպես որ կարելի է պարզապես գործարկել մի քանի goroutine-ներ, որոնք ընթերցում են նույն ալիքից։

  2. sync.WaitGroup օգտագործում՝ սինխրոնիզացիայի համար — որպեսզի սպասենք բոլոր goroutine-ների ավարտին։

Օրինակ՝

package main

import (
    "fmt"
    "sync"
)

func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for val := range ch {
        fmt.Printf("Աշխատող %d ստացավ %d\n", id, val)
    }
}

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

    // գործարկում ենք 3 goroutine, որոնք ընթերցում են ալիքից
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(i, ch, &wg)
    }

    // ուղարկում ենք տվյալներ ալիքին
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch) // փակել ալիքը, որպեսզի goroutine-ները ավարտվեն

    wg.Wait() // սպասում ենք բոլոր goroutine-ների ավարտին
}

Այսպիսով, Go-ի ալիքը արդեն ապահովում է անվտանգ մուտք գործելիս միաժամանակ մի քանի goroutine-ներից ընթերցելիս, կարևորն այն է, որ ճիշտ կառավարենք նրանց կյանքի ցիկլը և փակենք ալիքը։