美文网首页
如何在 select 中实现优先级

如何在 select 中实现优先级

作者: wayyyy | 来源:发表于2022-08-07 00:27 被阅读0次

    转载一篇文章:Go语言在select语句中实现优先级

    select 语句中有个性质是:如果多个case 同时满足的情况,会随机选择一个case。
    那么假设有2个case满足,怎么按照我们的想法先执行case A,再执行 case B 呢?也就是满足我们想要的优先级。

    func (tc *NoExecuteTaintManager) worker(worker int, done func(), stopCh <-chan struct{}) {
        defer done()
    
        // 当处理具体事件的时候,我们会希望 Node 的更新操作优先于 Pod 的更新
        // 因为 NodeUpdates 与 NoExecuteTaintManager无关应该尽快处理
        // -- 我们不希望用户(或系统)等到PodUpdate队列被耗尽后,才开始从受污染的Node中清除pod。
        for {
            select {
            case <-stopCh:
                return
            case nodeUpdate := <-tc.nodeUpdateChannels[worker]:
                tc.handleNodeUpdate(nodeUpdate)
                tc.nodeUpdateQueue.Done(nodeUpdate)
            case podUpdate := <-tc.podUpdateChannels[worker]:
                // 如果我们发现了一个 Pod 需要更新,我么你需要先清空 Node 队列.
            priority:
                for {
                    select {
                    case nodeUpdate := <-tc.nodeUpdateChannels[worker]:
                        tc.handleNodeUpdate(nodeUpdate)
                        tc.nodeUpdateQueue.Done(nodeUpdate)
                    default:
                        break priority
                    }
                }
                // 在 Node 队列清空后我们再处理 podUpdate.
                tc.handlePodUpdate(podUpdate)
                tc.podUpdateQueue.Done(podUpdate)
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:如何在 select 中实现优先级

          本文链接:https://www.haomeiwen.com/subject/uogvwrtx.html