当前位置: 首页 > 面试题库 >

goroutine没有输出

益光亮
2023-03-14
问题内容

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语言规范:程序执行:

程序执行首先初始化主程序包,然后调用函数main。当该函数调用返回时,程序退出。它不等待其他(非main)goroutine完成。

有关更多详细信息,请参见此答案。

您必须告诉您的main()函数等待以SayHello()goroutine形式启动的函数完成。您可以将它们与通道同步,例如:

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
}

另一种选择是通过关闭通道来发出完成信号:

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()函数随机打印“混合”数字:您不能保证观察到这种行为。同样,请参阅上述答案以获取更多详细信息。在
转到内存模型
只能保证某些事件发生的其他事件之前,你有没有保证2个并发够程是如何执行的。

您可以尝试使用它,但是知道结果将不确定。首先,您必须启用多个活动goroutine才能执行:

runtime.GOMAXPROCS(2)

其次,您必须首先SayHello()以goroutine身份启动,因为当前代码首先SayHello()在主goroutine中执行,并且只有在完成后才启动另一个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


 类似资料:
  • 由于某些原因,在运行此代码时,我没有得到输出。我不明白为什么。我肯定这是基本的原因,但在我看来一切都是正确的。 下面是输出:

  • 我需要检查为什么exec函数停止我的php脚本。 我在HTTP查询中调用了“exec”函数中的bat文件(但我遇到了passthru、system和proc_open的问题),2分钟后我得到了一个错误代码500(没有详细信息)。但是我的bat文件总是在后台运行(我可以看到创建的文件…)我是这样使用它的: 在$输出中我什么都得不到,在phperror_log什么都没有...我添加了以下参数: 同样的

  • 这个程序创建了一个名为datafile.txt的文件,并且应该使用文本I/O将100个随机创建的整数写入文件中。但是,我的输出是“java.util.Random@30c221”100次。我如何得到100个随机数?提前谢谢。

  • 我有以下简单的构建。gradle文件: 下面的单个java文件位于: 但是,如果我运行,我会在目录中得到一个jar,它没有主类集。它的清单文件没有条目。为什么会这样?

  • 我做了一个游戏,你可以和一个精灵一起跳,障碍物向玩家移动。我做了一个精灵遮罩来检测碰撞,但是什么也没发生:为了检查,我做了一个简单的print语句,当两个精灵碰撞时什么起作用。我测试了播放器精灵是否有故障,但当我让播放器精灵与自己碰撞时,控制台打印出碰撞。所以也许障碍雪碧有问题?

  • 我正在尝试从事件中心读取数据,但结果它只返回空值。 我将一个数据帧转换为json以发送到eventhub 这是数据的模式 我正在尝试使用从eventhub读取数据 从 pyspark.sql.类型导入数组类型, 双类型, 结构类型, 结构字段, 字符串类型, 长类型, 布尔类型