运行时:goroutine 永远阻塞

问题描述 投票:0回答:0

我这里有这段 Golang 代码

package main

import (
    "fmt"
    "time"
)

func main() {
    burstyLimiter := make(chan time.Time, 3)
    for i := 1; i <= 3; i++ {
        burstyLimiter <- time.Now()
    }

    go func() {
        for t := range time.Tick(200 * time.Millisecond) {
            burstyLimiter <- t
        }
    }()

    burstyRequests := make(chan int, 5)
    for i := 1; i <= 5; i++ {
        burstyRequests <- i
    }
    for r := range burstyRequests {
        fmt.Println("received request", r, time.Now())
    }
}

当我运行它时,它会永远阻塞,如此处所示

那我这里还有一个稍微修改过的版本

package main

import (
    "fmt"
    "time"
)

func main() {

    burstyRequests := make(chan int, 5)
    for i := 1; i <= 5; i++ {
        burstyRequests <- i
    }
    for r := range burstyRequests {
        fmt.Println("received request", r, time.Now())
    }
}

此版本如预期的那样陷入僵局,如此处所示

对于永远阻塞的那个,我的假设是由于时间的行为。Tick 可能导致泄漏和通道上的范围阻塞,只要有可能写入通道。

我想得到帮助,以明确我对这种情况的理解是否正确。

go goroutine
© www.soinside.com 2019 - 2024. All rights reserved.