给定代码的执行流程将如何?以及例程将如何在这里执行?
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
}
答案
一旦完成对gen
和sq
的调用,将同时运行3个goroutine。它们是在通道之间传递数据,因此执行产生相同的结果。
- gen-inner
- sq-inner
- 主要
他们总是至少传递2条信息,因此按以下顺序运行其代码
- gen-inner
out <- n
-2-> sq-innerout <- n * n
-4-> mainprintln(<-out)
- gen-inner
out <- n
-3-> sq-innerout <- n * n
-9-> mainprintln(<-out)
可能还会发生第三遍,但在main
goroutine结束时可能会被跳过。
- gen-inner
close()
-close-> sq-innerclose(out)
-close->
另一答案
希望有帮助。它是goroutine管道图。因此,共有三个goroutine和两个通道
以上是关于给定代码的执行流程将如何?以及例程将如何在这里执行?的主要内容,如果未能解决你的问题,请参考以下文章