Junior — Middle
Чӣ гуна иҷрои хондани бехатар аз канал дар чанд goroutine ҳамзамон?
sobes.tech AI
Ҷавоб аз AI
В Go, барои бехатарона хондан аз канал аз ҷониби чанд goroutine ҳамзамон, одатан яке аз роҳҳои зерин истифода мешавад:
-
Як фиристанда, чанд қабулкунанда — канал сохта мешавад ва чанд goroutine аз он мехонанд. Канал дар Go барои хондани ҳамзамон аз ҷониби чанд goroutine бехатар аст, бинобар ин, метавон танҳо чанд goroutine-ро оғоз дод, ки аз як канал мехонанд.
-
Истифодаи
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 таъмин мекунад, муҳим он аст, ки ҳаёти онҳоро дуруст идора кунем ва каналро бандем.