登录
首页 >  Golang >  Go问答

只处理满缓冲通道的情况

来源:stackoverflow

时间:2024-02-15 17:18:16 277浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《只处理满缓冲通道的情况》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我想处理缓冲通道的所有元素,只有当它完全满时。我不能使用 for-range 因为它需要关闭通道,否则会引发死锁。我需要为下一批批次保持通道开放。这个方法可以吗?我在参数中传递长度,因为通道仍在获取数据,并且我想按顺序处理所有内容。

func flush(chnMap map[string]chan string) {
    for _, v := range chnMap {
        if len(v) == CAP {
            go processChan(v, len(v))
        }
    }
}

func processChan(chn <-chan string, length int) {
    for i := 0; i < length; i++ {
        op := <-chn
        //process chan
    }
}

正确答案


我想说你当前的解决方案可能是 95% 正确的。但是,您仍然可以进行一些更改:

func flush(chnMap map[string]chan string) {
    for _, v := range chnMap {
        if len(v) >= CAP {
            go processChan(v, len(v))
        }
    }
}

func processChan(chn <-chan string, length int) {
    for i := 0; i < length; i++ {
        op := <-chn
        // process chan
    }
}

此代码或多或少与您的代码相同,只是当 len(v) 的大小与 cap 相同或大于 cap 时,它将调用 len(v)。这将涵盖当您检查处理时通道已满的情况。您当然可以通过为缓冲区指定显式容量来处理此问题,但这无需强制执行该设计决策即可工作。

理论要掌握,实操不能落!以上关于《只处理满缓冲通道的情况》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>