-
Notifications
You must be signed in to change notification settings - Fork 0
xpool
omeyang edited this page Sep 17, 2026
·
1 revision
稳定性:Stable · 覆盖率:100.0% · 源码:
pkg/util/xpool
泛型 Worker Pool。固定 worker 数 + 有界队列 + 优雅关闭。
- 限制并发:固定 N 个 worker 处理任务流
- 解耦生产消费:队列缓冲突发负载
- 任务级 panic 隔离:单任务 panic 不影响其他 worker
import "github.com/omeyang/xkit/pkg/util/xpool"
p, err := xpool.New[string](
8, // workers
100, // queue size
func(task string) {
process(task)
},
xpool.WithLogger(slog.Default()),
)
if err != nil { /* ... */ }
defer p.Shutdown(context.Background())
if err := p.Submit("hello"); err != nil {
// ErrQueueFull / ErrPoolStopped
}| 名称 | 说明 |
|---|---|
Pool[T] |
泛型 Pool |
New[T](workers, queueSize, handler, opts...) (*Pool[T], error) |
构造 |
Submit(task T) error |
非阻塞提交 |
Shutdown(ctx) error |
带超时优雅关闭 |
Close() error |
等所有任务完成(=Shutdown(Background)) |
Done() <-chan struct{} |
所有 worker 退出后关闭的通道 |
Workers / QueueSize / QueueLen |
状态查询 |
WithLogger(*slog.Logger) |
自定义日志 |
ErrNilHandler / ErrPoolStopped / ErrQueueFull / ErrInvalidWorkers / ErrInvalidQueueSize |
错误变量 |
-
submitMuRWMutex:保护 queue 发送 vs Close;write lock 等所有 in-flight Submit -
safeHandle嵌套 recover:外层 recover 防 handler panic;内层 recover 防 logger 自身 panic 二次崩溃 -
上限:
maxWorkers = 1 << 16,maxQueueSize = 1 << 24 -
非阻塞提交:队列满 → 返
ErrQueueFull,由调用方决策(设计决策,见 doc.go:49-52) - handler 无 context:刻意不传 ctx,由 handler 自己捕获(设计决策)
-
QueueLen无锁:len(channel)Go 规范保证并发安全 -
Pool值复制守护:含sync.WaitGroup的noCopy,go vet copylocks守护;New返回*Pool指针
- 概念:
- 模式:
- ADR:
- API:api.md#pkgutilxpool