Go频道中的发件人顺序

用户4099632:

考虑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必须确定发送者可以发送到频道的顺序?否则,将无法保证会在乒乓球之前发出ping信号(即,您不能获得两次ping或连续两次发出pong)。这是如何运作的?

吉姆:

pingponggoroutine 之间没有同步,因此不能保证响应将按顺序打印。

如果强制goroutine在GOMAXPROCS> 1的情况下运行,则会得到随机输出:

pong
ping
ping
pong
ping
pong
ping
pong
pong

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章