jackc/puddle
GitHub: jackc/puddle
Puddle 是一个用 Go 编写的微型通用资源池库,提供了基于 context 的资源获取与释放、并发安全的连接管理以及池压力监控等核心能力。
Stars: 419 | Forks: 35
[](https://pkg.go.dev/github.com/jackc/puddle/v2)

# Puddle
Puddle 是一个用于 Go 的微型通用资源池库,它使用标准的
context 库来发送取消获取的信号。它旨在包含
资源池所需的最少功能。它可以直接使用,
也可以作为特定领域资源池的基础。例如,
数据库连接池可以在内部使用 puddle 并实现健康检查
和保活行为,而无需自己实现任何并发代码。
## 功能
* 通过 context 标准库实现获取取消
* 用于监控池压力的统计 API
* 除标准库和 golang.org/x/sync 外无其他依赖
* 高性能
* 可达代码的 100% 测试覆盖率
## 用法示例
```
package main
import (
"context"
"log"
"net"
"github.com/jackc/puddle/v2"
)
func main() {
constructor := func(context.Context) (net.Conn, error) {
return net.Dial("tcp", "127.0.0.1:8080")
}
destructor := func(value net.Conn) {
value.Close()
}
maxPoolSize := int32(10)
pool, err := puddle.NewPool(&puddle.Config[net.Conn]{Constructor: constructor, Destructor: destructor, MaxSize: maxPoolSize})
if err != nil {
log.Fatal(err)
}
// Acquire resource from the pool.
res, err := pool.Acquire(context.Background())
if err != nil {
log.Fatal(err)
}
// Use resource.
_, err = res.Value().Write([]byte{1})
if err != nil {
log.Fatal(err)
}
// Release when done.
res.Release()
}
```
## 状态
Puddle 是稳定的且功能完备的。
* 欢迎提交 Bug 报告和修复。
* 如果新功能可以在封装器中实现,通常不会被接受。
* 除非性能问题达到了 Bug 的程度,否则通常不会接受性能优化。
## 支持的 Go 版本
puddle 支持 Go 项目所支持的相同版本的 Go。对于 [Go](https://golang.org/doc/devel/release.html#policy),这是最近的两个主要版本。这意味着 puddle 支持 Go 1.19 及更高版本。
## 与 Go sync.Pool 的区别
它们适用于完全不同类型的资源:
* [sync.Pool](https://pkg.go.dev/sync#Pool) 通常用于内存中的对象。
* Puddle 通常用于外部对象的句柄,例如连接、文件句柄等。
具体区别:
* sync.Pool 没有限制池中最大资源的方法。
* sync.Pool 没有确保池中至少有最小资源的方法。
* sync.Pool 可以随时丢弃池中的资源 - 这对于创建成本高昂的连接来说并不理想。
* sync.Pool 没有清理/释放函数。资源会被 GC 回收,而没有机会干净地关闭。
* sync.Pool 没有处理创建资源时发生错误的方法。
* sync.Pool 不支持使用 context 来限制等待创建资源的时间。
## 许可证
MIT
标签:EVTX分析, 日志审计