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