gpt4 book ai didi

go - goroutine 没有输出

转载 作者:行者123 更新时间:2023-12-01 22:25:42 25 4
gpt4 key购买 nike

SayHello()按预期执行,goroutine 什么也不打印。

package main

import "fmt"

func SayHello() {
for i := 0; i < 10 ; i++ {
fmt.Print(i, " ")
}
}

func main() {
SayHello()
go SayHello()
}

最佳答案

当您的 main()函数结束,你的程序也结束。它不会等待其他 goroutine 完成。

引自 Go Language Specification: Program Execution :

Program execution begins by initializing the main package and then invoking the function main. When that function invocation returns, the program exits. It does not wait for other (non-main) goroutines to complete.



this answer更多细节。

你必须告诉你的 main()函数等待 SayHello()函数开始作为一个 goroutine 来完成。您可以将它们与 channel 同步,例如:
func SayHello(done chan int) {
for i := 0; i < 10; i++ {
fmt.Print(i, " ")
}
if done != nil {
done <- 0 // Signal that we're done
}
}

func main() {
SayHello(nil) // Passing nil: we don't want notification here
done := make(chan int)
go SayHello(done)
<-done // Wait until done signal arrives
}

另一种选择是通过关闭 channel 来表示完成:
func SayHello(done chan struct{}) {
for i := 0; i < 10; i++ {
fmt.Print(i, " ")
}
if done != nil {
close(done) // Signal that we're done
}
}

func main() {
SayHello(nil) // Passing nil: we don't want notification here
done := make(chan struct{})
go SayHello(done)
<-done // A receive from a closed channel returns the zero value immediately
}

备注:

根据您的编辑/评论:如果您希望 2 运行 SayHello()随机打印“混合”数字的功能:您无法保证观察到这种行为。再次,请参阅 aforementioned answer更多细节。 Go Memory Model仅保证某些事件在其他事件之前发生,您无法保证如何执行 2 个并发 goroutine。

您可能会尝试它,但要知道结果不会是确定性的。首先,您必须启用多个事件的 goroutine 来执行:
runtime.GOMAXPROCS(2)

其次你必须先开始 SayHello()作为 goroutine,因为您当前的代码首先执行 SayHello()在主 goroutine 中,只有在它完成后才会启动另一个:
runtime.GOMAXPROCS(2)
done := make(chan struct{})
go SayHello(done) // FIRST START goroutine
SayHello(nil) // And then call SayHello() in the main goroutine
<-done // Wait for completion

关于go - goroutine 没有输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60039133/

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