channel的有趣用法
版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc
引子
萌叔在阅读tailsamplingprocessor源码时,发现channel的一种有趣的玩法,这里记录一下
FIFO 队列
tailsamplingprocessor中通过NumTraces
设置内存中最多保存的trace的数量,
超过这个阈值,就从按照先进先出的原则,删除最先进入队列的trace
// NumTraces is the number of traces kept on memory. Typically most of the data
// of a trace is released after a sampling decision is taken.
NumTraces uint64 `mapstructure:"num_traces"`
postDeletion := false
currTime := time.Now()
for !postDeletion {
select {
case tsp.deleteChan <- id:
postDeletion = true
default:
traceKeyToDrop := <-tsp.deleteChan
tsp.dropTrace(traceKeyToDrop, currTime)
}
}
channel刚好满足这个特性,
如果tsp.deleteChan 没有满, 则往tsp.deleteChan写入一个traceID;
如果tsp.deleteChan已经装满,则从队列(tsp.deleteChan)中取出头部元素,
其实就是最先进入队列的traceID,将其对应的trace信息从内存中删除(tsp.dropTrace())。