Sobes.tech
Junior — Middle

Bir nechta goroutine bilan bir vaqtning o'zida kanal orqali ma'lumotlarni xavfsiz o'qishni qanday amalga oshirish mumkin?

sobes.tech AI

AIdan javob

Go tilida, bir kanaldan bir vaqtning o'zida bir nechta gorutinlar tomonidan xavfsiz o'qish uchun odatda quyidagi yondashuvlardan biri qo'llaniladi:

  1. Bir yuboruvchi, bir nechta qabul qiluvchi — kanal yaratiladi va bir nechta gorutinlar undan o'qiydi. Go'da kanal bir nechta gorutinlardan bir vaqtning o'zida xavfsiz o'qishga mo'ljallangan, shuning uchun bir kanal bilan bir nechta gorutinlarni ishga tushirish mumkin.

  2. sync.WaitGroup dan foydalanish bilan sinxronizatsiya qilish — barcha gorutinlar tugashini kutish uchun.

Misol:

package main

import (
    "fmt"
    "sync"
)

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

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

    // 3 ta gorutinni ishga tushiramiz, ular kanaldan o'qiydi
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(i, ch, &wg)
    }

    // Kanalga ma'lumot yuboramiz
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch) // Kanalni yopamiz, shunda gorutinlar tugaydi

    wg.Wait() // Barcha gorutinlar tugashini kutamiz
}

Shu tarzda, Go'dagi kanal allaqachon bir nechta gorutinlardan o'qishda xavfsiz kirishni ta'minlaydi, muhim bo'lsa, ularning hayot aylanishini to'g'ri boshqarish va kanalni yopishdir.