Documentation
¶
Overview ¶
Package queue 提供有界的泛型数据队列与任务队列
队列内部维护 Opened、Hanged、Closed 三种状态:消费到哨兵数据并调用 Done(true) 后进入 Hanged, 表示不再接收新数据,仅允许消费存量数据;Close 会关闭数据通道并释放所有 Wait 等待者。
注意:Write 与 Close 之间没有内部互斥,调用方必须自行保证二者串行执行(例如共用同一把读写锁), 否则可能向已关闭的通道写入而 panic;构造时传入 rw 可复用调用方的读写锁实现该互斥。
Index ¶
Constants ¶
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 ¶
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 ¶
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]) Write ¶
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 ¶
NewTasker 创建任务器 @param size int32 任务队列容量 @param timeout time.Duration 任务写入超时时间,0 表示不做超时控制 @param rw ...*sync.RWMutex 可选,调用方传入的读写锁,用于与 Close 互斥 @return @1 *Tasker 任务器实例
func (*Tasker) Commit ¶
Commit 提交任务 从对象池取出任务对象后填充任务函数并写入任务队列,入队失败时同步释放任务对象 @param fn func() 待执行的任务函数 @param wait ...bool 可选,是否需要等待任务完成,默认不等待 @return @1 *sync.WaitGroup 任务等待组,非等待模式下返回nil @return @2 error 任务入队失败时返回的错误
func (*Tasker) Handle ¶
Handle 处理任务 先确认队列信号(哨兵任务触发队列挂起),再安全执行任务函数并在执行完成后归还任务对象 @param tk *task 待处理的任务,为nil表示结束信号