1 个不稳定版本
0.2.0 | 2021年4月6日 |
---|---|
0.1.0 |
|
#35 in #object-pool
15KB
270 行
Rust 索引对象池
lib.rs
:
一个线程安全的索引对象池,具有自动返回和附加/分离语义。
对象池的目的是重用昂贵或频繁分配的对象。此池实现允许将同一类型的不同对象池作为子池进行索引。例如,您可以使用此功能池化SSH连接对象,按ipaddress:port进行索引。
此池绑定到大小以避免保持分配在控制之下。创建时可以设置两种不同的大小,max_pool_indexes
和 max_single_pool_size
,前者控制池可以包含多少索引,后者控制单个索引子池的最大大小。
此外,索引有一个以持续时间表示的过期时间。
示例
创建池
默认池创建如下,有32个索引,容量为8个元素,从创建后5分钟过期
use indexed_pool::Pool;
let pool: Pool<String> = Pool::default();
示例池,包含64个容量为64个元素的 Vec<u8>
,从创建后10秒过期
use std::time::Duration;
use indexed_pool::Pool;
let pool: Pool<u8> = Pool::new(64, 64, Duration::from_secs(10));
使用池
从池中拉取的基本用法
use indexed_pool::Pool;
struct Obj {
size: usize,
}
let pool: Pool<Obj> = Pool::default();
let obj = pool.pull("item1", || Obj{size: 1});
assert_eq!(obj.size, 1);
let obj2 = pool.pull("item1", || Obj{size: 1});
assert_eq!(obj.size, 1);
从池中拉取并 detach()
use indexed_pool::Pool;
struct Obj {
size: usize,
}
let pool: Pool<Obj> = Pool::default();
let obj = pool.pull("item1", || Obj{size: 1});
assert_eq!(obj.size, 1);
let obj2 = pool.pull("item1", || Obj{size: 1});
assert_eq!(obj.size, 1);
let (pool, obj) = obj.detach();
assert_eq!(obj.size, 1);
pool.attach("item1", obj);
跨线程使用
只需将池包装在 std::sync::Arc
中即可
use std::sync::Arc;
use indexed_pool::Pool;
let pool: Arc<Pool<String>> = Arc::new(Pool::default());
警告
池中的对象不会被自动重置,它们会被返回但不会重置。您可能需要在从池中拉取后调用 object.reset()
或 object.clear()
或任何其他等效的函数来重置您使用的对象
依赖项
~6.5MB
~117K SLoC