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 таъмин мекунад, муҳим он аст, ки ҳаёти онҳоро дуруст идора кунем ва каналро бандем.