我是 Go 新手,在理解并发和通道方面遇到问题。
package main
import "fmt"
func display(msg string, c chan bool){
fmt.Println("display first message:", msg)
c <- true
}
func sum(c chan bool){
sum := 0
for i:=0; i < 10000000000; i++ {
sum++
}
fmt.Println(sum)
c <- true
}
func main(){
c := make(chan bool)
go display("hello", c)
go sum(c)
<-c
}
程序的输出是:
display first message: hello
10000000000
但我认为应该只有一行:
display first message: hello
因此,在 main 函数中,
display 和 sum 同时运行,并且 sum 需要更长的时间,因此 display 应将 true 发送给 c,并且程序应在 sum 完成之前退出...
我不确定我是否理解清楚。有人可以帮我解决这个问题吗?谢谢你!
程序的确切输出未定义,取决于调度程序。调度器可以在当前未被阻塞的所有 goroutine 之间自由选择。它试图通过在很短的时间间隔内切换当前的 goroutine 来同时运行这些 goroutine,以便用户感觉到一切都同时发生。除此之外,它还可以在不同的CPU上并行执行多个goroutine(如果你碰巧有一个多核系统并且增加了运行时.GOMAXPROCS)。可能导致输出的一种情况是:
-
main
创建两个 goroutine
- 调度程序选择立即切换到新的 goroutine 之一并选择
display
-
display
打印出消息并被通道发送阻塞(c <- true
)因为还没有接收器。
- 调度程序选择运行
sum
next
- 计算总和并打印在屏幕上
- 调度程序选择不恢复
sum
goroutine(它已经使用了相当长的时间)并继续display
-
display
将值发送到通道
- 调度程序选择接下来运行 main
- main 退出并且所有 goroutine 都被销毁
但这只是一种可能的执行顺序。还有很多其他的,其中一些会导致不同的输出。如果您只想打印第一个结果并随后退出程序,您可能应该使用result chan string
并改变你的main
打印功能fmt.Println(<-result)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)