首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Go通道中发送者的排序

问在Go通道中发送者的排序
EN

Stack Overflow用户
提问于 2015-03-16 21:46:31
回答 2查看 519关注 0票数 3

考虑一下来自http://www.golang-book.com/10/index.htm#section2的乒乓示例。

代码语言:javascript
复制
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必须决定发件人可以发送到信道的顺序吗?否则,就不能保证乒乓球会在乒乓球之前发出(也就是说,你不能一连得到两枚乒乓球或两支乒乓球)。这是怎么回事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 22:30:32

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

如果您强迫goroutines与GOMAXPROCS>1进行竞争,则会得到随机输出:

代码语言:javascript
复制
pong
ping
ping
pong
ping
pong
ping
pong
pong

这甚至不是一个“乒乓球”的例子,因为没有电话和响应。

票数 7
EN

Stack Overflow用户

发布于 2015-03-17 21:29:41

最近,在选择消息进入通道的顺序上出现了一个related question。

答案是顺序是,通常是不确定的。这是故意的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29087538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档