【发布时间】:2018-08-12 16:20:35
【问题描述】:
我是golang的初学者,正在学习goroutine和channel。直觉上,我认为 golang 中的 gorountine 本质上是一个独立运行的线程。因此,如果有多个 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)
}
【问题讨论】:
标签: go concurrency goroutine