gpt4 book ai didi

go - 在以 channel 为特色的 Go case 语句中,阻塞发生在哪里?

转载 作者:IT王子 更新时间:2023-10-29 01:38:26 26 4
gpt4 key购买 nike

我是围棋菜鸟

我在看这个结构:

for {
select {
case <-resyncCh:
case <-stopCh:
return
case <-cancelCh:
return
}
if r.ShouldResync == nil || r.ShouldResync() {
// do stuff
}
resyncCh = r.resyncChan()
}

假设 resyncCh 上没有消息。

所有 case 是否并行评估(阻塞)?还是有另一条我没有看到的路径?

我是这样读的:

  • 阻止 resyncChstopChcancelCh chan 并行等待消息<
  • 如果在 resyncCh 上收到一条消息,我们会有效地跳转到 r.ShouldResync 的东西,但其他 block 在另一个 chan还有。
  • 如果在 stopChcancelCh chan 上的任何一点收到消息,返回,有效地“断开”所有 chan在这里。

对吗?

最佳答案

直接回答您的问题:

  • 阻止并行等待消息的 resyncCh、stopCh 和 cancelCh channel 。是的。

  • 如果在 resyncCh 上收到消息,我们实际上会跳转到 r.ShouldResync 内容,但其他 chans 上的其他 block 仍然存在。 ,它们不会保留,您已通过选择 但是,由于此循环,您将再次阻塞。您还可以使用 fallthrough 关键字让它们在通过初始关键字后阻塞。

  • 如果在 stopCh 或 cancelCh chan 上的任何一点收到消息,则返回,有效地与此处的所有 chan“断开连接”。 正确 - 他们会从此函数返回。

此外,请记住您可以使用 default 做什么 --> https://gobyexample.com/non-blocking-channel-operations

for {
select {
case <-resyncCh:
case <-stopCh:
return
case <-cancelCh:
return
default:
fmt.Printf("will keep printing\n")
}
if r.ShouldResync == nil || r.ShouldResync() {
// do stuff
}
resyncCh = r.resyncChan()
}

更新:另一个有用的模式,我现在正在使用,它利用了这一点:

select {
case m := <-c:
handle(m)
case <-time.After(5 * time.Minute):
fmt.Println("timed out")
}

在这里你可以等待,阻塞,在 channel 上,但最终超时,只需要使用 golang time 包。非常简洁易读。将其与具有 timespec 值的 poll() 进行比较。 https://golang.org/pkg/time/#After

关于go - 在以 channel 为特色的 Go case 语句中,阻塞发生在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47211332/

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