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)

}

作者写道:


“该程序现在将轮流打印乒乓。”


然而,要实现这一点,Go 必须决定发送者可以发送到通道的顺序?否则,将无法保证 ping 会在 pong 之前发送(即您无法获得两次 ping 或连续两次 pong)。这是如何运作的?


蓝山帝景
浏览 237回答 2
2回答

神不在的星期二

ping和ponggoroutine之间没有同步,因此不能保证响应会按顺序打印。如果你强制 goroutines 以 GOMAXPROCS>1 竞争,你会得到随机输出:pongpingpingpongpingpongpingpongpong这甚至不是“乒乓”的例子,因为没有呼叫和响应。

慕田峪4524236

最近有一个关于进入频道的消息选择顺序的相关问题。答案是顺序通常是不确定的。这是故意的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go