首页  >  文章  >  后端开发  >  为什么我的 Go 程序中的 Goroutine 没有执行?

为什么我的 Go 程序中的 Goroutine 没有执行?

Patricia Arquette
Patricia Arquette原创
2024-11-02 18:46:02571浏览

Why Doesn't My Goroutine Execute in My Go Program?

Goroutine 执行异常

用户遇到了一个令人困惑的情况,他们的 goroutine 无法在 Go 程序中执行。尽管使用匿名函数创建了一个 goroutine 并将消息发送到主函数内的通道,但“输入 goroutine...”的预期输出并不存在。

检查提供的代码表明该 goroutine 确实是创建并将指针传递给消息通道。但问题出在程序后续的执行流程上。

缺少同步

最关键的问题是main函数和goroutine之间没有同步。程序在打印“Done!”后结束,没有提供任何机制让 goroutine 继续运行。

Go 允许 goroutine 与主程序并发执行。但是,如果 main 函数在 goroutine 完成任务之前退出,则 goroutine 将提前终止。

可能的解决方案

要解决此问题,程序必须实现同步机制确保 main 函数等待 goroutine 完成。这可以通过多种方法来实现:

  • 等待通道: 创建另一个通道,等待与创建的 goroutine 数量相等的特定数量的消息。 main 函数可以阻塞在这个通道上,直到收到所有消息,表明所有 goroutine 完成。
  • sync.WaitGroup: 使用sync.WaitGroup 来跟踪活动 goroutine 的数量并当每个 goroutine 完成时减少它。 main 函数可以调用 WaitGroup.Wait() 阻塞,直到计数为零,确保所有 goroutine 都完成。
  • Select 语句: 利用 select 语句等待两个 goroutine 的输入消息通道和“完成”通道。当从消息通道接收到消息时,对其进行处理。当从“done”通道收到消息时,关闭消息通道并退出 goroutine。 main 函数可以向“done”通道发送消息,表示程序已完成。

进一步探索

Go 博客提供了一个优秀的了解 Go 中并发的资源,可以在以下链接找到:[Go 博客:并发](https://blog.golang.org/go-concurrency-patterns)。

以上是为什么我的 Go 程序中的 Goroutine 没有执行?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn