首页 > 后端开发 > Golang > 为什么 Golang 的无缓冲通道输出顺序看起来违反直觉?

为什么 Golang 的无缓冲通道输出顺序看起来违反直觉?

Mary-Kate Olsen
发布: 2024-12-16 21:15:12
原创
322 人浏览过

Why Does Golang's Unbuffered Channel Output Order Seem Counterintuitive?

理解 Golang 中的通道输出顺序

在 Golang 中,无缓冲通道在 goroutine 之间提供了可靠的通信机制。然而,它们的输出顺序有时可能会令人困惑。考虑以下代码:

func main() {
  messages := make(chan string)
  go func() { messages <- "hello" }()
  go func() { messages <- "ping" }()
  msg := <-messages
  msg2 := <-messages
  fmt.Println(msg)
  fmt.Println(msg2)
}
登录后复制

运行此代码时,它始终打印“ping”,然后打印“hello”。这似乎违反直觉,因为人们可能期望输出与创建 Goroutine 的顺序相匹配。

要理解为什么会发生这种情况,重要的是要记住通道是通信管道,而 Goroutine 代表并行任务。即使 Goroutine 是按照特定的顺序创建的,它们的执行顺序也无法保证。

在这种情况下,调度程序可能会将发送“ping”的 Goroutine 安排在发送“hello”的 Goroutine 之前。当第一个接收者(即 msg :=

收到第一条消息后,程序将继续执行直到第二个接收器 (msg2 :=

因此,输出顺序由写入通道的 goroutine 的执行顺序决定,而不是它们的创建顺序或从通道读取消息的顺序。要验证这一点,可以按照提供的答案中的建议向 Goroutine 添加一条 Println 语句:

...
func() { messages <- "hello"; fmt.Println("Hello sent") }()
func() { messages <- "ping"; fmt.Println("Ping sent") }()
...
登录后复制

这将输出:

Hello sent
Ping sent
ping
hello
登录后复制

这确认消息已发送并以相同的顺序打印。

以上是为什么 Golang 的无缓冲通道输出顺序看起来违反直觉?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板