Go 为什么这个代码会停滞?
主要的围棋套路将球放在一个通道上。球员goroutine接球,操纵球,然后将球放回通道并循环。在这一点上,它停止了 为什么玩家goroutine会停下来?难道它不能从自己身上捡起“球”吗?很抱歉,如果这是我的眼前,但我对golang并发性的理解让我相信玩家围棋程序应该能够自己打乒乓球Go 为什么这个代码会停滞?,go,concurrency,Go,Concurrency,主要的围棋套路将球放在一个通道上。球员goroutine接球,操纵球,然后将球放回通道并循环。在这一点上,它停止了 为什么玩家goroutine会停下来?难道它不能从自己身上捡起“球”吗?很抱歉,如果这是我的眼前,但我对golang并发性的理解让我相信玩家围棋程序应该能够自己打乒乓球 type Ball struct{ hits int } func main() { table := make(chan *Ball) go player("pong", table)
type Ball struct{ hits int }
func main() {
table := make(chan *Ball)
go player("pong", table)
table <- new(Ball) // game on; toss the ball
time.Sleep(1 * time.Second)
<-table // game over; grab the ball
}
func player(name string, table chan *Ball) {
for {
ball := <-table
ball.hits++
fmt.Println(name, ball.hits)
time.Sleep(100 * time.Millisecond)
table <- ball
}
}
键入Ball结构{hits int}
func main(){
表:=制造(成龙*球)
围棋玩家(“乒乓球”,桌上)
表它不会停止。
它只是出口
这是因为球员在发回球时,必须等待main
例程将球捡起来。
一旦主程序收到球,它就会退出。
这会中断所有当前的goroutine,意味着玩家完成的循环被停止
这里有两个玩家
只需添加:
go player("ping", table)
而你:
报告补充说:
我的意思是,为什么它不在player
中循环多次呢?
如果你把睡眠时间增加到10分钟,它会变得更加明显
这是一本书
player
不会循环,因为table
是一个无缓冲通道:一旦player发回球,player将阻止,直到有人将球从桌上取下。
而且没有人可以移除所说的球
:main
正在休眠10秒,然后移除它并立即退出,防止玩家再次循环(因为所有程序都已停止)
请参阅“”,以查看无缓冲通道与缓冲通道的图示
表睡眠10秒,但有缓冲通道(容量1),(播放器睡眠1秒):
也就是说:player 1
从表
中拾取球
,并将其发送回表。它不会阻塞,因为缓冲通道没有容量过大。它不会暂停。
它只是出口
这是因为球员在发回球时,必须等待main
例程将球捡起来。
一旦主程序收到球,它就会退出。
这会中断所有当前的goroutine,意味着玩家完成的循环被停止
这里有两个玩家
只需添加:
go player("ping", table)
而你:
报告补充说:
我的意思是,为什么它不在player
中循环多次呢?
如果你把睡眠时间增加到10分钟,它会变得更加明显
这是一本书
player
不会循环,因为table
是一个无缓冲通道:一旦player发回球,player将阻止,直到有人将球从桌上取下。
而且没有人可以移除所说的球
:main
正在休眠10秒,然后移除它并立即退出,防止玩家再次循环(因为所有程序都已停止)
请参阅“”,以查看无缓冲通道与缓冲通道的图示
表睡眠10秒,但有缓冲通道(容量1),(播放器睡眠1秒):
也就是说:player 1
从表
中拾取球
,并将其发送回表中。它不会阻塞,因为缓冲通道没有超出容量。很抱歉,我的问题不够具体。我的意思是,为什么它不会在player中循环不止一次。如果你将睡眠时间增加到10次,它就不会停止变得更evident@user3204416我已相应地编辑了答案,并提供了其他游乐场示例来说明这种行为。非常感谢。我不知道发送和接收时保留的频道。@user3204416在您的情况下,非缓冲频道将保留在发送和接收时。如我所示,缓冲频道不会保留(至少如果您一次投球/接球不超过一个球)对不起,我的问题不够具体。我的意思是,为什么它不在播放器中循环不止一次。如果你将睡眠时间增加到10,它会变得更多evident@user3204416我对答案进行了相应的编辑,并提供了其他游乐场示例来说明这种行为。非常感谢。我不知道发送和接收上的频道@user3204416在您的情况下,发送和接收时将保留一个无缓冲通道。如我所示,缓冲通道不会保留(至少如果您一次不放置/接收多个球)。请参阅对已接受答案的评论,以便更好地理解我的问题。请参阅对已接受答案的评论,以便更好地理解我的问题。
pong 1
pong 2
pong 3
pong 4
pong 5
pong 6
pong 7
pong 8
pong 9
pong 10
pong 11
time's up