Порядок отправителей в канале Go

Рассмотрим пример пинг-понга из 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)
}

Авторы пишут:

«Теперь программа будет по очереди печатать ping и pong».

Однако, чтобы это было правдой, Go должен определить порядок, в котором отправители могут отправлять сообщения в канал. В противном случае не было бы никакой гарантии, что пинг будет отправлен перед понгом (т. е. вы не можете получить два пинга или два понга подряд). Как это работает?


person Community    schedule 16.03.2015    source источник
comment
Мое внутреннее ощущение, что заказ просто совпадение. Но я думаю, что peterSO докажет, что я ошибаюсь.   -  person topskip    schedule 17.03.2015
comment
Верный. Это плохой пример использования каналов, и это даже не пинг-понг (обычно это означает вызов + ответ).   -  person JimB    schedule 17.03.2015
comment
Это не совпадение, это побочный эффект того факта, что кроме отправки мало что происходит, а печать занимает больше времени, чем отправка. когда один отправитель отправляет и канал очищается, другой уже готов со своей отправкой и т. д. Это действительно плохой пример каналов как механизма синхронизации, и если бы кто-то из них выполнял реальную работу, это было бы не так. .   -  person Not_a_Golfer    schedule 17.03.2015


Ответы (2)


Между горутинами ping и pong нет синхронизации, поэтому нет гарантии, что ответы будут напечатаны по порядку.

Если вы заставите горутины участвовать в гонках с GOMAXPROCS>1, вы получите случайный вывод:

pong
ping
ping
pong
ping
pong
ping
pong
pong

Это даже не пример "пинг-понга", так как нет звонка и ответа.

person JimB    schedule 16.03.2015

Был связанный с вопрос о порядке отбора сообщений, поступающих на канал в последнее время.

Ответ заключается в том, что порядок обычно недетерминирован. Это сделано намеренно.

person Rick-777    schedule 17.03.2015