#object-pool #pool #cache #library

indexed-pool

高效/频繁分配的索引对象池

1 个不稳定版本

0.2.0 2021年4月6日
0.1.0 2021年4月6日

#35 in #object-pool

MIT 许可证

15KB
270

Rust 索引对象池

Docs.rs Crates.io Release License


lib.rs:

一个线程安全的索引对象池,具有自动返回和附加/分离语义。

对象池的目的是重用昂贵或频繁分配的对象。此池实现允许将同一类型的不同对象池作为子池进行索引。例如,您可以使用此功能池化SSH连接对象,按ipaddress:port进行索引。

此池绑定到大小以避免保持分配在控制之下。创建时可以设置两种不同的大小,max_pool_indexesmax_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