我观看了关于高级 Go 并发模式的精彩视频。一开始,Sameer Ajmani 展示了一个乒乓应用程序。
package main
import (
"fmt"
"time"
)
type Ball struct{ hits int }
func main() {
table := make(chan *Ball)
go player("ping", table)
go player("pong", table)
table <- new(Ball) // game on; toss the ball
time.Sleep(1 * time.Second)
fmt.Println(<-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
}
}
代码是如何工作的,我理解到 90%。它们是两个 goroutine,它们在主线程休眠期间相互发送消息,ping 和 pong。
然后我尝试跟随
package main
import (
"fmt"
"time"
)
type Ball struct{ hits int }
func main() {
table := make(chan *Ball)
go player("ping", table)
go player("pong", table)
table <- new(Ball) // game on; toss the ball
time.Sleep(1 * time.Second)
fmt.Println(<-table) // game over; grab the ball
fmt.Println(<-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
}
}
我在这里陷入僵局,真的不明白为什么。查看 go 例程中的最后一行,我尝试像倒数第二行一样从通道接收值。在后台,两个 goroutine 仍然继续循环并相互发送值。对我来说,它似乎是表变量通道的多个接收器。
我的主要问题是,我在第二个样本中遇到了什么僵局?
蛊毒传说
相关分类