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ден окуу учурунда коопсуз кирүүгө кепилдик берет, негизгиси алардын жашоо циклин туура башкаруу жана каналды жабуу.