【发布时间】:2019-06-21 13:25:33
【问题描述】:
下面给出的代码输出有点令人困惑,请帮助我理解通道和 goroutine 的行为以及如何 执行是否真的发生了。
我试图理解程序的流程但是“调用goroutine”之后的语句被执行,即使调用了goroutine, 稍后执行 goroutine 中的语句,
在第二次“调用 goroutine”时,行为不同,打印顺序/程序流程发生变化。
以下是代码:
package main
import "fmt"
func main() {
fmt.Println("1")
done := make(chan string)
go test(done)
fmt.Println("7")
fmt.Println(<-done)
fmt.Println("8")
fmt.Println(<-done)
fmt.Println("9")
fmt.Println(<-done)
}
func test(done chan string) {
fmt.Println("2")
done <- "3"
done <- "10"
fmt.Println("4")
done <- "5"
fmt.Println("6")
}
以上代码的结果:
1
7
2
3
8
10
9
4
6
5
请帮助我了解为什么以及如何得出这个结果。
【问题讨论】:
-
如果你继续运行它(而不是在操场上),你可能每次都会得到不同的结果。并发性是不确定的,您对非锁定操作顺序的任何期望都是错误的。在查看并发代码时,您必须以不同的方式考虑程序流程;它不是一个单一的、可预测的流,而是多个并发的独立流。它仅在它们相互影响的锁定点(例如通道发送/接收)。
-
我已经在 VSCode 中运行了这段代码,但是每次的输出都是一样的,并且顺序没有改变。我知道并发是如何工作的,但是这个程序在 VSCode 中总是给出完全相同的输出,为什么会这样???
-
因为它就是这样运行的。这里的顺序并不能完全保证,但是在相同条件下运行时也没有足够的变化来获得不同的输出。
-
输出的哪一部分令人困惑。你期望什么价值?我建议您从一个较短的示例开始。
-
当我运行一个包含 goroutines 的程序时,我知道在 goroutines 的情况下,输出总是会以不同的顺序排列,并且没有特定的顺序可以保证,但是我在 VSCode 中运行了这个程序 每次我运行它时它都会给出相同的输出,不管多少次。还有一件事,为什么程序在调用goroutine之后打印出语句,即为什么它打印出
7,即使调用了go test (done)func/goroutine,为什么不呢?在调用 func/goroutine 时打印出2并且控制是使用go test(done){}函数???
标签: go channel goroutine channels