jackc/puddle

GitHub: jackc/puddle

Puddle 是一个用 Go 编写的微型通用资源池库,提供了基于 context 的资源获取与释放、并发安全的连接管理以及池压力监控等核心能力。

Stars: 419 | Forks: 35

[![Go 参考](https://pkg.go.dev/badge/github.com/jackc/puddle/v2.svg)](https://pkg.go.dev/github.com/jackc/puddle/v2) ![构建状态](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg) # 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分析, 日志审计