gpt4 book ai didi

go - 关于golang channel 的一些问题

转载 作者:行者123 更新时间:2023-12-02 16:06:52 24 4
gpt4 key购买 nike

我正在 YouTube 上观看一个讨论并发模式的视频。有一个乒乓球示例:

type Ball struct{ hits int }
func main() {
table := make(chan *Ball)
go player("ping", table)
go player("pong", table)

table <- new(Ball)
time.Sleep(1 * time.Second)
<-table
}

func player(name string, table chan *Ball) {
for {
ball := <-table
ball.hits++
fmt.Println(name, ball.hits)
time.Sleep(100 * time.Millisecond)
table <- ball
}
}

这应该给出结果:

Ping 1
Pong 2
Ping 3
Pong 4
...

但是,如果我删除玩家的一个 goroutine,例如“pong”:

// go player("pong", table) // remove this line

我只得到一个结果:

Ping 1

我不明白func播放器中有一个for循环,并且“表” channel 将Ball提供给ball,在循环结束时,我们将Ball放回到 channel 表中。为什么玩家“ping”不能与自己玩?

最佳答案

该 channel 是无缓冲的,这意味着一个例程必须接收才能完成另一例程的发送。如果删除 pong 播放器,ping 播放器将被阻止在 channel 上发送(pong 无法接收),因此它永远不会移至循环的下一次迭代以接收其自己的消息。

如果要使 channel 缓冲,并且缓冲区中有空间,则发送将是非阻塞的:table := make(chan *Ball, 1)。这将允许一个球被“保留”在 channel 的缓冲区中,直到接收者准备好为止。

关于go - 关于golang channel 的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58239778/

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