给定代码的执行流程将如何? Go例程将在这里如何执行?

时间:2019-11-04 11:02:13

标签: go concurrency goroutine

(并发编程新手) 怀疑为什么goroutine的执行流程在这里有点怪异?

开始使用golang进行goroutines和channel操作。

func main() {
    // Set up the pipeline.
    c := gen(2, 3)
    out := sq(c)

    // Consume the output.
    fmt.Println(<-out) // 4
    fmt.Println(<-out) // 9
}

func sq(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        for n := range in {
            out <- n * n
        }
        close(out)
    }()
    return out
}

func gen(nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        for _, n := range nums {
            out <- n
        }
        close(out)
    }()
    return out
}

2 个答案:

答案 0 :(得分:2)

gensq的调用完成后,将同时运行3个goroutine。它们在通道之间传递数据,因此执行产生相同的结果。

  1. gen-inner
  2. 内在
  3. 主要

他们总是至少传递2条信息,因此按照下面的顺序运行代码

  1. gen-inner out <- n -2-> sq-inner out <- n * n -4-> main println(<-out)
  2. gen-inner out <- n -3-> sq-inner out <- n * n -9-> main println(<-out)

可能还会发生第三遍,但是可能会在main goroutine结束时被跳过。

  1. gen-inner close() -close-> sq-inner close(out) -close->

答案 1 :(得分:2)

enter image description here

希望有帮助。它是goroutine管道图。所以有三个goroutines和两个通道