#atomic #non-blocking #lock-free #garbage

object-pool

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

22个版本

新版本 0.6.0 2024年8月18日
0.5.4 2021年5月10日
0.5.3 2020年5月25日
0.4.4 2019年10月29日
0.1.6 2019年2月2日

#30 in 内存管理

Download history 14324/week @ 2024-05-03 16946/week @ 2024-05-10 17023/week @ 2024-05-17 18196/week @ 2024-05-24 20313/week @ 2024-05-31 14921/week @ 2024-06-07 16316/week @ 2024-06-14 19339/week @ 2024-06-21 16190/week @ 2024-06-28 9536/week @ 2024-07-05 9889/week @ 2024-07-12 10517/week @ 2024-07-19 9044/week @ 2024-07-26 8668/week @ 2024-08-02 9064/week @ 2024-08-09 9480/week @ 2024-08-16

38,293 每月下载量
用于 21 个Crate (9 个直接使用)

MIT/Apache

2.5MB
378

对象池

License Cargo Documentation

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

对象池的目标是重用昂贵或频繁分配的对象

使用方法

[dependencies]
object-pool = "0.5"
extern crate object_pool;

示例

创建池

一般池创建看起来像这样

 let pool: Pool<T> = Pool::new(capacity, || T::new());

示例:具有4096个容量的32 Vec<u8>

 let pool: Pool<Vec<u8>> = Pool::new(32, || Vec::with_capacity(4096));

使用池

从池中获取的基本用法

let pool: Pool<Vec<u8>> = Pool::new(32, || Vec::with_capacity(4096));
let mut reusable_buff = pool.try_pull().unwrap(); // returns None when the pool is saturated
reusable_buff.clear(); // clear the buff before using
some_file.read_to_end(reusable_buff);
// reusable_buff is automatically returned to the pool when it goes out of scope

从池中取出并 detach()

let pool: Pool<Vec<u8>> = Pool::new(32, || Vec::with_capacity(4096));
let mut reusable_buff = pool.try_pull().unwrap(); // returns None when the pool is saturated
reusable_buff.clear(); // clear the buff before using
let (pool, reusable_buff) = reusable_buff.detach();
let mut s = String::from(reusable_buff);
s.push_str("hello, world!");
pool.attach(s.into_bytes()); // reattach the buffer before reusable goes out of scope
// reusable_buff is automatically returned to the pool when it goes out of scope

跨线程使用

您只需将池包装在 std::sync::Arc

let pool: Arc<Pool<T>> = Arc::new(Pool::new(cap, || T::new()));

警告

池中的对象不会被自动重置,它们被返回,但不会被重置。您可能需要在从池中取出对象后调用 object.reset()object.clear() 或您正在使用的对象的任何等效方法

查看 文档 获取更多示例

性能

基准测试比较了 alloc()pool.try_pull()pool.detach()

查看结果

对于那些不喜欢图表的人来说,这里有原始输出

依赖项