gpt4 book ai didi

带有 for 循环的 golang channel 行为

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:06 26 4
gpt4 key购买 nike

我很好奇 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 秒的刻度,但它不是必须的)。

最佳答案

select只会在下一次调用,如果上一个case对应的代码已经完成就打勾,
你仍然可以通过指定 channel 的大小来获得一些杠杆,即 channel := make(chan bool,10)

见下文:

func main() {

channel := make(chan bool, 10)
go func() {
tick := time.Tick(time.Duration(1) * time.Second)
for {
select {
case <-tick:
fmt.Printf("Producer: TICK %v\n", time.Now())
channel <- true
}
}
}()

for {
select {
case canProcess := <-channel:
time.Sleep(3* time.Second)
fmt.Printf("Consumer: Completed : %v\n")
fmt.Printf("%v\n", canProcess)
}
}
}

关于带有 for 循环的 golang channel 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48758102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com