在Go频道中对发件人进行排序

时间:2015-03-16 21:46:31

标签: concurrency go channels

考虑来自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)。这是如何工作的?

2 个答案:

答案 0 :(得分:7)

pingpong goroutines之间没有同步,因此无法保证响应按顺序打印。

如果强制goroutines与GOMAXPROCS&gt; 1比赛,你会得到随机输出:

pong
ping
ping
pong
ping
pong
ping
pong
pong

这甚至不是乒乓球的例子,因为没有呼叫和响应。

答案 1 :(得分:1)

最近输入频道的邮件选择顺序为related question

答案是订单通常是非确定性的。这是故意的。