为了账号安全,请及时绑定邮箱和手机立即绑定

Go 频道中发送者的排序

Go 频道中发送者的排序

Go
蓝山帝景 2021-09-21 18:10:58
考虑来自http://www.golang-book.com/10/index.htm#section2 的乒乓球示例。package mainimport (    "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)。这是如何运作的?
查看完整描述

2 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

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


如果你强制 goroutines 以 GOMAXPROCS>1 竞争,你会得到随机输出:


pong

ping

ping

pong

ping

pong

ping

pong

pong

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


查看完整回答
反对 回复 2021-09-21
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

最近有一个关于进入频道的消息选择顺序的相关问题

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



查看完整回答
反对 回复 2021-09-21
  • 2 回答
  • 0 关注
  • 236 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信