为了账号安全,请及时绑定邮箱和手机立即绑定

Go 通道缓冲和死锁

Go 通道缓冲和死锁

Go
一只名叫tom的猫 2021-12-20 15:13:09
考虑以下代码块,预计会因达到缓冲区限制而引发错误: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")    }}但是,当我尝试使用以下确切块时,它会阻塞而不是抛出错误。我想了解这种行为。谢谢你的时间。package mainimport (    "fmt"    "time")func main() {    requests := make(chan int, 5)    close(requests)    limiter := time.Tick(time.Millisecond * 200)    for req := range requests {        <-limiter        fmt.Println("request", req, time.Now())    }    burstyLimiter := make(chan time.Time, 4)    for i := 0; i < 5; i++ {        burstyLimiter <- time.Now()        fmt.Println("adding to burstyLimiter")    }}
查看完整描述

1 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

当 Go 运行时发现所有 goroutine 都处于死锁状态时,您会感到恐慌:等待某个“内部”事件,从某种意义上说是内部事件,另一个 goroutine 预计会触发它。

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

在第二个程序中,您有一个“隐藏的”goroutine,它是通过调用time.Tick. 这个 goroutine 在一个通道上发送滴答声,但不会阻塞它(“丢弃滴答声以弥补慢速接收器”来自文档)。所以在第二个例子中你至少有一个正在运行的 goroutine,它偶尔会阻塞外部事件(计时器滴答),因此从 Go 运行时死锁检测的角度来看,整个系统没有死锁。


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信