Senior
func main() { c := make(chan int, 1000) for i := 0; i < 100; i++ { go foo(c) } sum := 0 for r := range c { sum += r } fmt.Println(sum) } func foo(c chan int) { r := rand.Int() for i := 0; i < r; i++ { c <- r } } --- func main() { c := make(chan int, 1000) var wg sync.WaitGroup wg.Add(100) for i := 0; i < 100; i++ { go func() { defer wg.Done() foo(c) }() } go func() { wg.Wait() close(c) }() sum := 0 for r := range c { sum += r } // // fmt.Println(sum) } func foo(c chan int) { r := rand.Int() for i := 0; i < r; i++ { c <- r } }
sobes.tech AI
პასუხი AI-სგან
პირველი ვერსიის კოდში არის პრობლემა: ციკლი for r := range c უსასრულოდ ელოდება, რადგან არხი c არასოდეს იხურება. ამის გამო პროგრამა ჩერდება.
მეორე ვერსიაში დამატებულია sync.WaitGroup, რათა დაელოდოს ყველა გორუტინის დასრულებას, და ამის შემდეგ არხი c იხურება. ეს საშუალებას აძლევს სწორად გამოვიდეს არხიდან წაკითხვის ციკლიდან.
ძირითადი პუნქტები:
- გამოყენება
sync.WaitGroupყველა გორუტინის დასრულების მონიტორინგისთვის. - არხის დახურვა ყველა გორუტინის წერის დასრულების შემდეგ.
for r := range cციკლი დასრულდება, როდესაც არხი დაიხურება.
სწორი კოდის მაგალითი:
group := sync.WaitGroup{}
group.Add(100)
for i := 0; i < 100; i++ {
go func() {
defer group.Done()
foo(c)
}()
}
go func() {
group.Wait()
close(c)
}()
sum := 0
for r := range c {
sum += r
}