我很好奇 channel 的行为以及它们与循环相关的工作方式。假设我有以下代码:

消费者

tick := time.Tick(time.Duration(2) * time.Second)
for {
    select {
    case <-tick:
        p.channel <-true
    }
}

我有一个 goroutine 具有以下内容:

处理器

for {
    select {
    case canProcess := <-p.channel:
        // synchronous process that takes longer than 2 seconds
    case <-p.stop:
        return
    }
}

如果消费者推送到 channel 的速度比处理器完成同步过程的速度快,会发生什么情况?

它们是堆积起来等待处理器完成,还是跳过一个“节拍”?

如果它们堆积起来,是否存在内存泄漏的可能性?

我知道我可以将同步过程放在 goroutine 中,但这实际上是为了了解 channel 的行为方式。 (即我的示例有一个 2 秒的刻度,但它不是必须的)。