Go 频道中发送者的排序
Ordering of senders in a Go channel
考虑 http://www.golang-book.com/10/index.htm#section2 中的乒乓示例。
package main
import (
"fmt"
"time"
)
func pinger(c chan string) {
for i := 0; ; i++ {
c <- "ping"
}
}
func ponger(c chan string) {
for i := 0; ; i++ {
c <- "pong"
}
}
func printer(c chan string) {
for {
msg := <- c
fmt.Println(msg)
time.Sleep(time.Second * 1)
}
}
func main() {
var c chan string = make(chan string)
go pinger(c)
go ponger(c)
go printer(c)
var input string
fmt.Scanln(&input)
}
作者写道:
"The program will now take turns printing ping and pong."
但是,要实现这一点,Go 必须确定发送方可以发送到通道中的顺序吗?否则,将无法保证 ping 会在 pong 之前发送(即您无法获得两个 ping,或连续两个 pong)。这是如何工作的?
ping
和 pong
goroutines 之间没有同步,因此不能保证响应会按顺序打印。
如果你强制 goroutines 与 GOMAXPROCS>1 竞争,你会得到随机输出:
pong
ping
ping
pong
ping
pong
ping
pong
pong
这甚至不是 "ping-pong" 的示例,因为没有调用和响应。
最近进入频道的消息选择顺序有
答案是顺序通常是不确定的。这是故意的。