gpt4 book ai didi

concurrency - go例程中的执行顺序

转载 作者:IT王子 更新时间:2023-10-29 01:51:29 25 4
gpt4 key购买 nike

我最近开始使用 go,我真的很困惑这个程序的执行顺序。我希望我在这里问的不是非常琐碎的问题。

这基本上是 golang 之旅中的 #69,我插入了一些 Println; Playground 链接:http://play.golang.org/p/PXDlD3EA2f

func fibonacci(c, quit chan int) {
x, y := 0, 1

fmt.Println("Inside the fibonacci")

for {
select {
case c <- x:
fmt.Println("Inside the for, first case, before reassigning ", x, y)
x, y = y, x+y
fmt.Println("Inside the for, first case, after reassigning ", x, y)
case <-quit:
fmt.Println("quit")
return
}
}
}

func main() {
fmt.Println("Begin of Main")
c := make(chan int)
quit := make(chan int)
fmt.Println("Before gonig to the func")
go func() {
fmt.Println("Inside go routine")
fmt.Println("Inside go routine... again")
for i := 0; i < 10; i++ {
fmt.Println("Inside go routine and the for, before printing the channel")
fmt.Println(<-c)
}
quit <- 0
}()
fmt.Println("Before calling to fibonacci")
fibonacci(c, quit)
fmt.Println("Closing")
}

在我获得的非常详细的输出中(见下图),有几件事我不明白:

  • 为什么在 go 例程中“Inside the fibonacci”行在这些行之前?这是因为在 go 命令之后,编译器只是同时读取 func 和 fibonacci 中的内容吗?

  • fibonacci 和 func 如何相互作用? func 没有改变 channel c,那么为什么斐波那契 react ?谁在改变 c?

  • 为什么斐波那契里面每次都有 5 个打印在一起?老实说,我只期待 2。

函数的输出:

enter image description here

最佳答案

让我们一步一步来:

* 为什么“Inside the fibonacci”行在 go routine 之前?这是因为在 go 命令之后,编译器只是同时读取 func 和 fibonacci 吗?

因为您的 go 例程实际上是在您调用 fibonacci 之后开始的,所以调度程序需要一点时间才能启动,例如,如果您启动一个调用 fmt.Println 的 goroutine > 并且在 main 中不做任何等待,程序将在执行之前退出。

* fibonacci 和 func 如何相互作用? func 没有改变 channel c,那么为什么斐波那契 react ?谁在改变 c?

fibonacci 正在将数字插入 channel ,注意这部分:

select {
case c <- x: //this is sending x to the channel

* 为什么斐波那契里面每次都有5个打印在一起?老实说,我只期待 2。

这又取决于调度程序和 fmt.Print* 不锁定标准输出的事实,输出可以以任何顺序发生,因为它是 2 个不同的线程打印内容。

关于concurrency - go例程中的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25417961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com