gpt4 book ai didi

concurrency - Go channel 中发送者的排序

转载 作者:IT王子 更新时间:2023-10-29 00:52:34 25 4
gpt4 key购买 nike

考虑来自 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)
}

作者写道:

"The program will now take turns printing ping and pong."

但是,要实现这一点,Go 必须确定发送者可以发送到 channel 中的顺序吗?否则,将无法保证 ping 会在 pong 之前发送(即您无法获得两个 ping,或连续两个 pong)。这是如何工作的?

最佳答案

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

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

pong
ping
ping
pong
ping
pong
ping
pong
pong

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

关于concurrency - Go channel 中发送者的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29087538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com