我正在通过 Udemy 课程学习基本的围棋。在 goroutines 部分,有一个节流的例子,它让我理解了等待组是如何工作的。
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
func main() {
c1 := make(chan int)
c2 := make(chan int)
go populate(c1)
go fanOutIn(c1, c2)
for v := range c2 {
fmt.Println(v)
}
fmt.Println("about to exit")
}
func populate(c chan int) {
for i := 0; i < 100; i++ {
c <- i
}
close(c)
}
func fanOutIn(c1, c2 chan int) {
var wg sync.WaitGroup
const goroutines = 10
wg.Add(goroutines)
for i := 0; i < goroutines; i++ {
go func() {
for v := range c1 {
func(v2 int) {
c2 <- timeConsumingWork(v2)
}(v)
}
wg.Done()
}()
}
wg.Wait()
close(c2)
}
func timeConsumingWork(n int) int {
time.Sleep(time.Microsecond * time.Duration(rand.Intn(500)))
return n + rand.Intn(1000)
}
不符合我理解的部分是在fanOutIn我们设置WaitGroup, 和Add(10).
为什么我打印出 100 个值?只能将单个值 ( i := 0) 放入c1,并且该值永远不会从通道中显式删除。然后代码命中wg.Done(),等待组队列减少到 9,依此类推。
根据我目前的理解,我希望看到 10 个值0 + rand.Intn(1000)。
一只甜甜圈
相关分类