【发布时间】:2011-08-24 10:08:02
【问题描述】:
我正在尝试理解 Go 语言。我试图创建两个 goroutine 使用两个通道链接它们之间的流:
func main() {
c1 := make(chan int)
c2 := make(chan int)
go func() {
for i := range c1{
println("G1 got", i)
c2 <- i
}
}()
go func() {
for i := range c2 {
println("G2 got", i)
c1 <- i
}
}()
c1 <- 1
time.Sleep(1000000000 * 50)
}
正如预期的那样,这段代码会打印出来:
G1 got 1
G2 got 1
G1 got 1
G2 got 1
....
直到主函数退出。
但是如果我从主通道向其中一个通道发送另一个值,它会突然阻塞:
func main() {
c1 := make(chan int)
c2 := make(chan int)
go func() {
for i := range c1{
println("G1 got", i)
c2 <- i
}
}()
go func() {
for i := range c2 {
println("G2 got", i)
c1 <- i
}
}()
c1 <- 1
time.Sleep(1000000000 * 1)
c1 <- 2
time.Sleep(1000000000 * 50)
}
输出
G1 got 1
G2 got 1
G1 got 1
G2 got 1
G1 got 2
然后阻塞直到主要结束。
发送给 c1 的值“2”到达第一个 goroutie,后者将其发送给 c2,但第二个 goroutine 从不接收。
(在此示例中使用大小为 1(c1 或 c2)的缓冲通道)
为什么会这样?当在真实代码中发生这种情况时,我该如何调试它?
【问题讨论】: