Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 为什么这个代码会停滞?_Go_Concurrency - Fatal编程技术网

Go 为什么这个代码会停滞?

Go 为什么这个代码会停滞?,go,concurrency,Go,Concurrency,主要的围棋套路将球放在一个通道上。球员goroutine接球,操纵球,然后将球放回通道并循环。在这一点上,它停止了 为什么玩家goroutine会停下来?难道它不能从自己身上捡起“球”吗?很抱歉,如果这是我的眼前,但我对golang并发性的理解让我相信玩家围棋程序应该能够自己打乒乓球 type Ball struct{ hits int } func main() { table := make(chan *Ball) go player("pong", table)

主要的围棋套路将球放在一个通道上。球员goroutine接球,操纵球,然后将球放回通道并循环。在这一点上,它停止了

为什么玩家goroutine会停下来?难道它不能从自己身上捡起“球”吗?很抱歉,如果这是我的眼前,但我对golang并发性的理解让我相信玩家围棋程序应该能够自己打乒乓球

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