延时队列增加数量获取功能
This commit is contained in:
		
							parent
							
								
									49f4d119ec
								
							
						
					
					
						commit
						28086ea8ee
					
				| @ -3,23 +3,37 @@ package lock_free | ||||
| import ( | ||||
| 	"iter" | ||||
| 	"sync" | ||||
| 	"sync/atomic" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| type DelayLkQueue[TKey comparable, TValue any] struct { | ||||
| 	timers     map[TKey]*time.Timer | ||||
| 	delayCount atomic.Uint64 // 用于统计延时队列数量
 | ||||
| 	m          sync.Mutex | ||||
| 	LkQueue[TValue] | ||||
| } | ||||
| 
 | ||||
| // NewDelayLkQueue 创建延迟无锁队列
 | ||||
| func NewDelayLkQueue[TKey comparable, TValue any]() *DelayLkQueue[TKey, TValue] { | ||||
| 	return &DelayLkQueue[TKey, TValue]{make(map[TKey]*time.Timer), sync.Mutex{}, *NewLkQueue[TValue]()} | ||||
| 	return &DelayLkQueue[TKey, TValue]{ | ||||
| 		make(map[TKey]*time.Timer), | ||||
| 		atomic.Uint64{}, | ||||
| 		sync.Mutex{}, | ||||
| 		*NewLkQueue[TValue](), | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // DelayCount 获取延时队列数量
 | ||||
| func (q *DelayLkQueue[TKey, TValue]) DelayCount() uint64 { | ||||
| 	return q.delayCount.Load() | ||||
| } | ||||
| 
 | ||||
| // DelayEnqueue 延迟入队
 | ||||
| func (q *DelayLkQueue[TKey, TValue]) DelayEnqueue(value TValue, duration time.Duration) { | ||||
| 	q.delayCount.Add(1) | ||||
| 	time.AfterFunc(duration, func() { | ||||
| 		q.delayCount.Add(^uint64(0)) | ||||
| 		q.Enqueue(value) | ||||
| 	}) | ||||
| } | ||||
| @ -31,7 +45,9 @@ func (q *DelayLkQueue[TKey, TValue]) CancellableDelayEnqueue(key TKey, value TVa | ||||
| 	if timer, ok := q.timers[key]; ok { | ||||
| 		timer.Stop() | ||||
| 	} | ||||
| 	q.delayCount.Add(1) | ||||
| 	q.timers[key] = time.AfterFunc(duration, func() { | ||||
| 		q.delayCount.Add(^uint64(0)) | ||||
| 		delete(q.timers, key) | ||||
| 		q.Enqueue(value) | ||||
| 	}) | ||||
| @ -42,6 +58,7 @@ func (q *DelayLkQueue[TKey, TValue]) CancelDelayEnqueue(key TKey) { | ||||
| 	q.m.Lock() | ||||
| 	defer q.m.Unlock() | ||||
| 	if timer, ok := q.timers[key]; ok { | ||||
| 		q.delayCount.Add(^uint64(0)) | ||||
| 		delete(q.timers, key) | ||||
| 		timer.Stop() | ||||
| 	} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user