1 Star 0 Fork 0

玟兵/go-util

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
queue.go 1.99 KB
一键复制 编辑 原始数据 按行查看 历史
玟兵 提交于 2024-11-27 15:32 +08:00 . 依赖更新 & 代码优化
package util
import (
"context"
"time"
)
type Queue struct {
data chan any
paused bool
}
// NewQueue 新建一个定长队列
func NewQueue(size uint64) *Queue {
if size == 0 {
size = 10
}
return &Queue{
data: make(chan any, size),
paused: false,
}
}
// Push 向队列中插入一条或多条数据,旧的数据单元有可能丢失!!!
func (q *Queue) Push(items ...any) {
l := len(items)
for i := 0; i < l && !q.paused; {
select {
case q.data <- items[i]:
i++
default:
select {
case <-q.data:
default:
}
}
}
}
// TryPushOne 尝试插入一条数据,立即返回成功或失败
func (q *Queue) TryPushOne(item any) bool {
if q.paused {
return false
}
select {
case q.data <- item:
return true
default:
return false
}
}
// PushWait 向队列中插入一条或多条数据,空间充满时,将会阻塞等待
func (q *Queue) PushWait(items ...any) {
l := len(items)
for i := 0; i < l && !q.paused; {
select {
case q.data <- items[i]:
i++
}
}
}
// Pop 从队列中拿出一条数据,FIFO原则
func (q *Queue) Pop() (any, bool) {
select {
case item := <-q.data:
return item, true
default:
return nil, false
}
}
// PopWait 从队列中拿出一条数据,阻塞等待
func (q *Queue) PopWait(td time.Duration) (any, error) {
if td <= 0 {
select {
case item := <-q.data:
return item, nil
}
} else {
ctx, cancel := context.WithTimeout(context.Background(), td)
defer cancel()
select {
case item := <-q.data:
return item, nil
case <-ctx.Done():
return nil, ctx.Err()
}
}
}
// PopAllWalk 逐个处理
func (q *Queue) PopAllWalk(fn func(item any)) {
for doPop := true; doPop; {
select {
case item := <-q.data:
fn(item)
default:
doPop = false
}
}
}
// PopAll 从队列中拿出所有的数据
func (q *Queue) PopAll() (ret []any) {
q.PopAllWalk(func(item any) {
ret = append(ret, item)
})
return
}
// Pause 暂停队列,忽略写入,能读出
func (q *Queue) Pause(b bool) {
q.paused = b
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/binny_w/go-util.git
git@gitee.com:binny_w/go-util.git
binny_w
go-util
go-util
v0.0.49

搜索帮助