queue

package
v2.6.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 29, 2026 License: MIT Imports: 5 Imported by: 4

Documentation

Overview

Package queue 提供有界的泛型数据队列与任务队列

队列内部维护 Opened、Hanged、Closed 三种状态:消费到哨兵数据并调用 Done(true) 后进入 Hanged, 表示不再接收新数据,仅允许消费存量数据;Close 会关闭数据通道并释放所有 Wait 等待者。

注意:Write 与 Close 之间没有内部互斥,调用方必须自行保证二者串行执行(例如共用同一把读写锁), 否则可能向已关闭的通道写入而 panic;构造时传入 rw 可复用调用方的读写锁实现该互斥。

Index

Constants

View Source
const (
	Opened = iota // 打开状态,可正常读写
	Hanged        // 挂起状态,已消费到结束信号,仅允许消费存量数据
	Closed        // 关闭状态,数据通道已关闭
)

Variables

This section is empty.

Functions

This section is empty.

Types

type Queue

type Queue[T any] struct {
	// contains filtered or unexported fields
}

Queue 有界泛型队列 通过状态机与结束等待组支持"写入结束信号后等待存量数据排空"的优雅关闭语义

func NewQueue

func NewQueue[T any](size int32, timeout time.Duration, rw ...*sync.RWMutex) *Queue[T]

NewQueue 创建队列 创建指定容量与写入超时时间的队列,初始状态为 Opened,结束等待组处于未释放状态 @param size int32 队列容量 @param timeout time.Duration 写入超时时间,0 表示不做超时控制(写入将阻塞直到写入成功) @param rw ...*sync.RWMutex 可选,调用方传入的读写锁;传入后写入过程将持有其读锁,用于与 Close 互斥 @return @1 *Queue[T] 队列实例

func (*Queue[T]) Clean

func (q *Queue[T]) Clean(f func(T))

Clean 清理已关闭队列中的所有数据,调用回调函数处理每个数据 仅可在队列关闭后调用,否则将阻塞等待新数据 @param f func(T) 处理函数

func (*Queue[T]) Close

func (q *Queue[T]) Close()

Close 关闭队列 关闭数据通道并释放队列结束等待,重复调用不会重复关闭通道; 调用方必须保证与 Write 串行执行,否则可能向已关闭的通道写入而 panic

func (*Queue[T]) Done

func (q *Queue[T]) Done(isCloseSig bool)

Done 完成一个数据的处理 递减背压计数;isCloseSig 为 true 且队列处于打开状态时,将队列置为挂起并释放队列结束等待; 队列已挂起或已关闭时不做任何处理 @param isCloseSig bool 是否为结束信号(消费到的数据为哨兵数据)

func (*Queue[T]) Read

func (q *Queue[T]) Read() <-chan T

Read 读取队列 返回队列的数据通道,消费方取出数据后需调用 Done 释放背压计数 @return @1 <-chan T 队列数据通道

func (*Queue[T]) Wait

func (q *Queue[T]) Wait()

Wait 等待队列完成 队列被关闭或结束信号被消费后返回

func (*Queue[T]) Write

func (q *Queue[T]) Write(t T, block ...bool) (err error)

Write 写入队列 写入前校验队列状态:挂起返回 ErrQueueHanged,关闭返回 ErrQueueClosed; 当 timeout > 0 且待处理数据量超过队列容量时,非阻塞写入将在 timeout 后返回 ErrWriteTimeout; 阻塞写入(block 为 true)或未配置超时(timeout <= 0)时,写入将阻塞直到写入成功 @param t T 待写入的数据 @param block ...bool 可选,是否阻塞写入,默认非阻塞(仅在 timeout > 0 时生效) @return @1 error 队列挂起、关闭或写入超时时返回的错误

type Tasker

type Tasker struct {
	// contains filtered or unexported fields
}

Tasker 任务器 承载节点内的异步任务队列

func NewTasker

func NewTasker(size int32, timeout time.Duration, rw ...*sync.RWMutex) *Tasker

NewTasker 创建任务器 @param size int32 任务队列容量 @param timeout time.Duration 任务写入超时时间,0 表示不做超时控制 @param rw ...*sync.RWMutex 可选,调用方传入的读写锁,用于与 Close 互斥 @return @1 *Tasker 任务器实例

func (*Tasker) Clean

func (t *Tasker) Clean()

Clean 清理任务队列 取消所有未完成的任务并释放其等待组,仅可在队列关闭后调用

func (*Tasker) Close

func (t *Tasker) Close()

Close 关闭任务队列

func (*Tasker) Commit

func (t *Tasker) Commit(fn func(), wait ...bool) (*sync.WaitGroup, error)

Commit 提交任务 从对象池取出任务对象后填充任务函数并写入任务队列,入队失败时同步释放任务对象 @param fn func() 待执行的任务函数 @param wait ...bool 可选,是否需要等待任务完成,默认不等待 @return @1 *sync.WaitGroup 任务等待组,非等待模式下返回nil @return @2 error 任务入队失败时返回的错误

func (*Tasker) Done

func (t *Tasker) Done() error

Done 停止接收任务 写入哨兵任务以通知消费方任务队列已结束,消费方处理哨兵后队列进入挂起状态 @return @1 error 写入失败时返回的错误

func (*Tasker) Handle

func (t *Tasker) Handle(tk *task, isExecute bool)

Handle 处理任务 先确认队列信号(哨兵任务触发队列挂起),再安全执行任务函数并在执行完成后归还任务对象 @param tk *task 待处理的任务,为nil表示结束信号

func (*Tasker) Read

func (t *Tasker) Read() <-chan *task

Read 读取任务队列 @return @1 <-chan *task 任务数据通道

func (*Tasker) Wait

func (t *Tasker) Wait()

Wait 等待所有任务完成 哨兵任务被消费或队列关闭后返回

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL