我正在通过Udemy课程学习基本的golang。在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)的值。
[请帮助我了解发生了什么。
我正在通过Udemy课程学习基本的golang。在goroutines部分中,有一个节流示例,使我对等待组的工作方式有所了解。包主要导入(“ fmt” ...
分离出来的函数的内容如下(包括前面的go
和要括起来的括号):