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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定代码的执行流程将如何?以及例程将如何在这里执行?相关的知识,希望对你有一定的参考价值。

(并发编程新手)怀疑为什么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
}
答案

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

  1. gen-inner
  2. sq-inner
  3. 主要

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

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

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

  1. gen-innerclose()-close-> sq-innerclose(out)-close->
另一答案

enter image description here

希望有帮助。它是goroutine管道图。因此,共有三个goroutine和两个通道

以上是关于给定代码的执行流程将如何?以及例程将如何在这里执行?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 vdhl 代码向自身添加文本

perl 中的调度子程序

我应该如何跟踪打开的 DataReader?

如何在InDesign文档中找到所有对象样式覆盖

从 .mat 文件中删除变量

如何在 Kotlin 中使用协程将图像保存在设备中