in golang
tags: channel

无锁编程--优先级channel

背景

处理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
}