考虑一下来自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)
}提交人写道:
“这个程序现在将轮流打印乒乓球和乒乓球。”
然而,要想做到这一点,Go必须决定发件人可以发送到信道的顺序吗?否则,就不能保证乒乓球会在乒乓球之前发出(也就是说,你不能一连得到两枚乒乓球或两支乒乓球)。这是怎么回事?
发布于 2015-03-16 22:30:32
ping和pong goroutines之间没有同步,因此不能保证响应将按顺序打印。
如果您强迫goroutines与GOMAXPROCS>1进行竞争,则会得到随机输出:
pong
ping
ping
pong
ping
pong
ping
pong
pong这甚至不是一个“乒乓球”的例子,因为没有电话和响应。
发布于 2015-03-17 21:29:41
最近,在选择消息进入通道的顺序上出现了一个related question。
答案是顺序是,通常是不确定的。这是故意的。
https://stackoverflow.com/questions/29087538
复制相似问题