Channel

无锁编程--优先级channel

published on
背景 处理channel中的数据过程中,涉及到配置的变更,配置变更后,数据的处理方式会跟随改变。在配置可以热加载的应用中,如何更新配置结构并应用新配置,而不产生竞争。 实现 方法有很多,锁、原子操作、atomic.Value等,但都不是这里的方法。按照golang的哲学,实现如下: func filter(srcC <-chan *T) <-chan *T { c := make(chan *T, 1024) conf := GetConfig() var dataP *T go func() { for { select { //select + default 实现优先级channel case <-eventC: conf = GetConfig() default: dataP = <-srcC if _, ok := conf[dataP.Id]; ok { c <- dataP } } } }() return c }