描述
go的如何实现优先级队列?
优先级别队列是否并发安全?
我的需求场景
实现了一个通信协议,收发消息。发送通道会阻塞。如果拥堵时,要控制拥堵消息的优先顺序。
优先级用Priority加上时间, Priority小优先, 早到优先。
原理
-
通过实现官方接口heap, 得到优先级队列
-
使用用chan进行控制并发控制,达到并发安全的效果
优先队列实现
package queue
import (
"xxxx/packets"
"container/heap"
"time"
)
//---------------------------------------
// 优先队列(提供并发安全接口)
//---------------------------------------
func NewPriorityQueue() *PriorityQueue{
q := &PriorityQueue{
isPushing: false,
ch: make(chan *QueueItem, 1),
}
return q
}
type PriorityQueue struct{
//队列(最小堆)
items []*QueueItem //堆
ch chan *QueueItem //同步控制
isPushing bool //推送状态
}
// 数据项
type QueueItem struct {
Value *packets.Packet // value
Priority int // 优先级(越小越靠前)
JoinTime time.Time // 加入时间
index int // 索引
}
//---------------------------------------
// heap接口
//---------------------------------------
func (pq PriorityQueue) Len() int {
return len(pq.items) }
func (pq PriorityQueue) Less