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

gopool

package
v0.3.0 Latest Latest
Warning

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

Go to latest
Published: Oct 16, 2026 License: MIT Imports: 6 Imported by: 0

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

func CtxGo

func CtxGo(ctx context.Context, f func())

CtxGo 在默认池中后台执行 f。

func CurrentWorkers

func CurrentWorkers() int

CurrentWorkers 返回默认池当前存活 worker 数。

func Go

func Go(f func())

Go 在默认池中后台执行 f。

func SetPanicHandler

func SetPanicHandler(h PanicHandler)

SetPanicHandler 设置默认池的 panic 处理器。

Types

type PanicHandler

type PanicHandler func(ctx context.Context, r any, stack []byte)

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

func (p *Pool) Close(ctx context.Context) error

Close 优雅排空:置关闭标记(此后提交走旁路)、唤醒全部 worker, 并等待所有已提交任务执行完成;ctx 到期返回其错误。 调用方应先停止提交再 Close;Close 可重复调用。

func (*Pool) Closed

func (p *Pool) Closed() bool

Closed 返回池是否已关闭。

func (*Pool) CtxGo

func (p *Pool) CtxGo(ctx context.Context, f func())

CtxGo 在池中后台执行 f;panic 时把 ctx 传给 PanicHandler。 队列满时回退为独立 goroutine 执行(任务不丢、依然 recover)。 wg 计数先于入队,保证 Close 的排空等待不漏任务。

func (*Pool) CurrentWorkers

func (p *Pool) CurrentWorkers() int

CurrentWorkers 返回当前存活 worker 数。

func (*Pool) Go

func (p *Pool) Go(f func())

Go 在池中后台执行 f。

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 池参数。零值字段取对应默认值。

func DefaultPoolOption

func DefaultPoolOption() PoolOption

DefaultPoolOption 返回带默认值的 PoolOption。

Jump to

Keyboard shortcuts

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