Documentation
¶
Overview ¶
Package gopool 自适应 goroutine 池:任务入队后按需惰性拉起 worker, 队列积压时扩容、空闲 worker 按 WorkerMaxAge 老化退出、队列满时回退为 直接 `go`(不阻塞调用方、不丢任务),全程 panic 被 recover。
与 async.GoSafe 的分工:GoSafe 每次调用起一个一次性 goroutine(并发上限 即调用方自控),适合低频后台任务;gopool 面向高频、突发的大批量任务, 用有界 worker 集合摊薄 goroutine 创建与调度开销,给并发数一个软上限 (MaxIdleWorkers 之上仍会临时超编,只是即用即走)。
典型接线(业务侧把 panic 汇入 logx):
gopool.SetPanicHandler(func(ctx context.Context, r any, stack []byte) {
logx.Error("gopool panic", "error", r, "stack", string(stack))
})
gopool.Go(func() { ... }) // 包级默认池
p := gopool.NewPool("ingest", gopool.PoolOption{MaxIdleWorkers: 64})
p.CtxGo(ctx, func() { ... }) // panic 处理器可拿到 ctx
设计参考 cloudwego/gopkg/concurrency/gopool(Apache-2.0,kitex 同源), 本实现为独立重写(MIT,oekit/concurrency):worker 惰性拉起、队列满回退、 时钟共享的老化检查思路一致;panic 处理器与老化时钟改用 atomic 消除上游的 数据竞争,并补充 Close(ctx) 排空语义(ekit 生命周期惯例)。
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type PanicHandler ¶
PanicHandler panic 恢复处理函数:ctx 为提交任务时的上下文(可能为 context.Background),r 为 recover 值,stack 为调用栈。
type Pool ¶
type Pool struct {
// contains filtered or unexported fields
}
Pool goroutine 池。零值不可用,经 NewPool 构造;Pool 并发安全。
func NewPool ¶
func NewPool(name string, opts ...PoolOption) *Pool
NewPool 创建名为 name 的池;opts 为空或字段零值时取默认值。
func (*Pool) Close ¶
Close 优雅排空:置关闭标记(此后提交走旁路)、唤醒全部 worker, 并等待所有已提交任务执行完成;ctx 到期返回其错误。 调用方应先停止提交再 Close;Close 可重复调用。
func (*Pool) CtxGo ¶
CtxGo 在池中后台执行 f;panic 时把 ctx 传给 PanicHandler。 队列满时回退为独立 goroutine 执行(任务不丢、依然 recover)。 wg 计数先于入队,保证 Close 的排空等待不漏任务。
func (*Pool) SetPanicHandler ¶
func (p *Pool) SetPanicHandler(h PanicHandler)
SetPanicHandler 设置 panic 处理器;nil 恢复默认(标准库 log)。
type PoolOption ¶
type PoolOption struct {
// MaxIdleWorkers 常驻 worker 上限;超出部分即用即走(取完存量任务立即退出)。
// <=0 取默认 1000。
MaxIdleWorkers int
// WorkerMaxAge worker 空闲老化时长,超龄退出。<=0 取默认 time.Minute。
WorkerMaxAge time.Duration
// TaskChanBuffer 任务队列长度;队列满时回退为直接 `go` 执行。
// <=0 取默认 1000。
TaskChanBuffer int
}
PoolOption 池参数。零值字段取对应默认值。