考虑来自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)
}
作者写道:
&#34;程序现在轮流打印ping和pong。&#34;
但是,为此,Go必须决定发件人可以发送到频道的顺序吗?否则,将无法保证在乒乓之前发送ping(即,您不能连续获得两个ping或两个pong)。这是如何工作的?
答案 0 :(得分:7)
ping
和pong
goroutines之间没有同步,因此无法保证响应按顺序打印。
如果强制goroutines与GOMAXPROCS&gt; 1比赛,你会得到随机输出:
pong
ping
ping
pong
ping
pong
ping
pong
pong
这甚至不是乒乓球的例子,因为没有呼叫和响应。
答案 1 :(得分:1)
最近输入频道的邮件选择顺序为related question。
答案是订单通常是非确定性的。这是故意的。