考虑到以下代码块,由于达到缓冲区限制,预计会抛出错误:
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")
}
}
答案 0 :(得分:1)
当Go运行时发现所有goroutine都处于死锁状态时,你会感到恐慌:等待某个“内部”事件,内部意味着另一个goroutine会触发它。
这是你在第一个程序中得到的。
在第二个程序中,您有一个“隐藏”的goroutine,由time.Tick
调用创建。这个goroutine在一个通道上发送滴答声,但不会阻塞它(“滴答滴答以弥补缓慢的接收者”形成文档)。因此,在第二个示例中至少有一个正在运行的goroutine,它偶尔会阻塞外部事件(计时器滴答),因此整个系统不会从Go运行时死锁检测的角度出现死锁。