去频道缓冲和死锁

时间:2016-03-05 08:30:50

标签: go

考虑到以下代码块,由于达到缓冲区限制,预计会抛出错误:

First 50: 00000010000000000100000000000000000000000110000100
Biased bits generated: 1000000
Unbiased bits used: 467997
mean: 0.099675

但是当我尝试使用以下内容的确切块时,它会阻塞而不是抛出错误。我想要了解这种行为。谢谢你的时间。

package main        

import (
    "fmt"
    "time"
)

func main() {

    burstyLimiter := make(chan time.Time, 4)

    for i := 0; i < 5; i++ {
        burstyLimiter <- time.Now()
        fmt.Println("adding to burstyLimiter")
    }

}

1 个答案:

答案 0 :(得分:1)

当Go运行时发现所有goroutine都处于死锁状态时,你会感到恐慌:等待某个“内部”事件,内部意味着另一个goroutine会触发它。

这是你在第一个程序中得到的。

在第二个程序中,您有一个“隐藏”的goroutine,由time.Tick调用创建。这个goroutine在一个通道上发送滴答声,但不会阻塞它(“滴答滴答以弥补缓慢的接收者”形成文档)。因此,在第二个示例中至少有一个正在运行的goroutine,它偶尔会阻塞外部事件(计时器滴答),因此整个系统不会从Go运行时死锁检测的角度出现死锁。