Golang例行程序节流阀示例

问题描述 投票:0回答:1

我正在通过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 wait goroutine
1个回答
1
投票

分离出来的函数的内容如下(包括前面的go和要括起来的括号):

© www.soinside.com 2019 - 2024. All rights reserved.