Help us shape the future of Go! Take the 2026 Go Developer Survey

batch

package
v0.23.2 Latest Latest
Warning

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

Go to latest
Published: Oct 29, 2026 License: MIT Imports: 4 Imported by: 0

Documentation

Overview

Package batch 提供攒批执行器:把零散任务攒成批次按条数/字节数/时间触发 批量执行,核心是 PeriodicalExecutor + TaskContainer 扩展点。

设计参考 go-zero core/executors(PeriodicalExecutor 的按需后台协程 + 空闲自退出模型),差异点:

  • Ticker/时钟可注入,批量时序测试完全确定(无需真实睡眠);
  • Execute 统一经 async.RunSafe 隔离 panic,一批失败不影响后续;
  • 变体精简为 Bulk(满 N 条)/ Chunk(满字节)/ Less(窗口去重)三个高频件。

常用形态:

// 攒满 64 条或每 100ms 批量下发
exe := batch.NewBulkExecutor(100*time.Millisecond, 64, func(tasks []any) {
    flush(tasks)
})
exe.Add(task)
defer exe.Wait() // 进程退出前排空积压

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type BatchOption

type BatchOption func(*batchOptions)

BatchOption 攒批执行器的可选参数。

func WithBatchClock

func WithBatchClock(now func() time.Time) BatchOption

WithBatchClock 注入时间源(LessExecutor 等按墙钟判定的执行器使用)。 nil 函数被忽略。

func WithBatchTicker

func WithBatchTicker(f TickerFactory) BatchOption

WithBatchTicker 注入周期信号源工厂(测试用手动 Ticker 即可确定性地驱动 flush 时序,无需真实睡眠)。nil 工厂被忽略。

type BulkExecutor

type BulkExecutor struct {
	*PeriodicalExecutor
}

BulkExecutor 满条数触发版攒批执行器:攒满 maxTasks 条立即 flush, 否则等 interval 周期。interval <= 0 表示只按条数触发。

func NewBulkExecutor

func NewBulkExecutor(interval time.Duration, maxTasks int, do func(tasks []any), opts ...BatchOption) *BulkExecutor

NewBulkExecutor 创建满条数触发的攒批执行器。maxTasks <= 0 或 do 为 nil 属于编程错误,直接 panic。

type ChunkExecutor

type ChunkExecutor struct {
	*PeriodicalExecutor
}

ChunkExecutor 满字节触发版攒批执行器:按任务声明的大小累计, 攒满 maxBytes 立即 flush,否则等 interval 周期。适合按负载体量 (日志字节、消息字节数)控制批次大小的场景。

func NewChunkExecutor

func NewChunkExecutor(interval time.Duration, maxBytes int64, do func(tasks []any), opts ...BatchOption) *ChunkExecutor

NewChunkExecutor 创建满字节触发的攒批执行器。maxBytes <= 0 或 do 为 nil 属于编程错误,直接 panic。

func (*ChunkExecutor) Add

func (e *ChunkExecutor) Add(task any, size int64)

Add 收纳一个任务并声明其大小(字节)。

type LessExecutor

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

LessExecutor 窗口去重执行器:同一 interval 窗口内至多执行一次, 其余调用丢弃。适合告警/日志限频——同一事件风暴只放行第一条。

func NewLessExecutor

func NewLessExecutor(interval time.Duration, do func(), opts ...BatchOption) *LessExecutor

NewLessExecutor 创建窗口去重执行器。interval <= 0 或 do 为 nil 属于 编程错误,直接 panic。

func (*LessExecutor) DoOrDiscard

func (e *LessExecutor) DoOrDiscard() bool

DoOrDiscard 窗口内首次调用执行 do 并返回 true,其余丢弃返回 false。 并发调用下同一窗口保证恰有一路执行(CAS 裁决)。

type PeriodicalExecutor

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

PeriodicalExecutor 攒批执行器:把零散任务攒进 TaskContainer,按间隔 周期或容器要求立即批量执行。

并发模型:

  • 首次 Add 按需拉起唯一后台循环;连续 idleExitRounds 个 interval 无积压 时自退出,下次 Add 重新拉起(退出与 Add 在同一临界区内判定,任务不会 滞留无人消费);
  • 取走积压(RemoveAll)在锁内完成,Execute 在锁外串行执行且 panic 被隔离;
  • Add/Flush/Wait 均可在多 goroutine 并发调用。

func NewPeriodicalExecutor

func NewPeriodicalExecutor(interval time.Duration, container TaskContainer, opts ...BatchOption) *PeriodicalExecutor

NewPeriodicalExecutor 创建攒批执行器。interval 为批量触发周期(<=0 表示 不设周期,仅容器主动要求或 Flush/Wait 驱动);container 为攒批容器。

func (*PeriodicalExecutor) Add

func (e *PeriodicalExecutor) Add(task any)

Add 收纳一个任务;容器要求立即 flush(AddTask 返回 true)时唤醒后台。

func (*PeriodicalExecutor) Flush

func (e *PeriodicalExecutor) Flush()

Flush 同步排空:立即取走当前积压并在调用方 goroutine 执行。与后台循环 并发调用安全(取走原子,双方各执行一半也保证不重不漏)。

func (*PeriodicalExecutor) Wait

func (e *PeriodicalExecutor) Wait()

Wait 请求后台排空积压后退出并阻塞至退出完成(幂等;退出后继续 Add 会 重新拉起后台)。适合进程退出前兜底,防止尾部批次丢失。

type TaskContainer

type TaskContainer interface {
	// AddTask 收纳一个任务,返回 true 表示需要立即触发一次 flush
	// (例如攒满条数或字节数)。
	AddTask(task any) bool
	// Execute 执行一批任务。执行器保证同一执行器同一时刻至多一路调用
	// (后台循环串行),panic 由执行器隔离,实现方无需自行 recover。
	Execute(tasks []any)
	// RemoveAll 取走并清空当前积压的全部任务;在执行器内部锁内调用,
	// 实现方无需自行加锁。
	RemoveAll() []any
}

TaskContainer 攒批容器扩展点:执行器只负责"何时触发 flush", "怎么攒、怎么执行"由容器实现决定。Bulk/Chunk 变体均构建其上。

type Ticker

type Ticker interface {
	C() <-chan time.Time
	Stop()
}

Ticker 周期信号源抽象。注入手动实现即可确定性地驱动批量时序测试。

type TickerFactory

type TickerFactory func(d time.Duration) Ticker

TickerFactory 按给定间隔构造 Ticker。

Jump to

Keyboard shortcuts

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