考虑来自http://www.golang-book.com/10/index.htm#section2 的乒乓球示例。package mainimport ( "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 必须决定发送者可以发送到通道的顺序?否则,将无法保证 ping 会在 pong 之前发送(即您无法获得两次 ping 或连续两次 pong)。这是如何运作的?
2 回答
神不在的星期二
TA贡献1963条经验 获得超6个赞
ping和ponggoroutine之间没有同步,因此不能保证响应会按顺序打印。
如果你强制 goroutines 以 GOMAXPROCS>1 竞争,你会得到随机输出:
pong
ping
ping
pong
ping
pong
ping
pong
pong
这甚至不是“乒乓”的例子,因为没有呼叫和响应。
- 2 回答
- 0 关注
- 236 浏览
添加回答
举报
0/150
提交
取消