package
1.2.2
Repository: https://github.com/min1324/data.git
Documentation: pkg.go.dev

# README

queue


队列(queue)是非常常用的一个数据结构,它只允许在队列的前端(head)进行出队(dequeue)操作,而在队列的后端(tail)进行入队(enqueue)操作。lock-free的算法都是通过CAS操作实现的。

使用 Go 实现队列算法,队列包有以下几种队列:

  1. 单锁链表,切片,环形队列。
  2. 双锁链表,切片,环形队列。
  3. 无锁链表,切片队列。
struct名说明使用场景
SAQueue单锁切片,无界限。简单并发不高,或者连续入队不多的情况。
SLQueue单锁链表,无界限。简单并发不高,无法预测连续入队多少的情况。
SRQueue单锁环形,有界限,默认:DefaultSize。高频入队出队能预测多少的情况。
DLQueue双锁链表,无界限。高频入队出队,但无法预测多少的情况。
DRQueue双锁环形,有界限,默认:DefaultSize。高频入队出队,能预测多少的情况。
LLQueue无锁链表,无界限。高并发无法预测的情况。
LRQueue无锁环形,有界限,默认:DefaultSize。高并发,能预测最大容量情况。

总体性能大概:slice>LR>LL>SA,DL>DR,SL,SR

最后还提供了一个n路的队列,可以通过自定义New,实现自定义队列。slice是无锁n路,每一路都是一个队列。通过轮寻方式降低了每一路队列的并发粒度。

Queue接口:

type Queue interface {
	EnQueue(interface{}) bool
	DeQueue() (val interface{}, ok bool)
}

EnQueue:

将val加入队尾,返回是否成功。

DeQueue:

取出队头val,返回val和是否成功,如果不成功,val为nil。