Goroutine执行顺序

Ele*_*ega 5 concurrency go goroutine

我是golang的初学者,正在学习goroutine和channel。直观上,我认为golang中的goroutine本质上是一个独立运行的线程。因此,如果有多个goroutine,执行顺序就无法保证。因此,以下代码应以随机顺序输出“ping”和“pong”。然而,我观察到该程序依次产生“ping”和“pong”。谁能为我解释一下原因吗?任何回复都会有帮助。谢谢!

我发现的另一个有趣的观察是,如果我不在打印机函数内调用 sleep 函数,程序将以随机顺序输出。

package main

import (
  "fmt"
  "time"
)

func pinger(c chan string) {
  for i := 0; ; i++ {
    c <- "ping"
  }
}

func printer(c chan string) {
  for {
    msg := <- c
    fmt.Println(msg)
    time.Sleep(time.Second * 1)
  }
}

func ponger(c chan string) {
  for i := 0; ; i++ {
    c <- "pong"
  }
}

func main() {
  var c chan string = make(chan string)

  go pinger(c)
  go ponger(c)
  go printer(c)

  var input string
  fmt.Scanln(&input)
}
Run Code Online (Sandbox Code Playgroud)

pet*_*rSO 4

Go 编程语言规范

渠道类型

容量(以元素数量表示)设置通道中缓冲区的大小。如果容量为零或不存在,则通道无缓冲,并且仅当发送方和接收方都准备好时通信才会成功。


您有一个无缓冲的通道:make(chan string)

msg := <- c(准备接收)和 c <- "ping"(准备发送):发送和接收"ping"

msg := <- c(准备接收)和 c <- "pong"(准备发送):发送和接收"pong"