#object-pool #thread-safe #derivable #automatic-reusage

可派生对象池

一个线程安全的可派生对象池集合,具有对象的自动复用功能

2 个版本

0.1.1 2023年7月13日
0.1.0 2023年7月13日

#481 in 内存管理

MIT/Apache

19KB
187

可派生对象池

此crate提供了一个可以通过一行代码派生的特质,以实现类型对象的池。使用户能够忘记ObjectPool的实现细节,专注于代码的重要部分

与其他对象池crate相比,此crate有以下特点

  • 可派生:池子易于使用,可以与任何类型一起使用。可以使用#[derive(ObjectPool)]属性宏进行派生。
  • 可复用:用户可以使用ObjectPool::new函数从池中创建对象,如果可能的话,将复用池中的对象。这些项目将包装在Reusable结构中,当它们被丢弃时将返回池中。
  • 线程安全:池是线程安全的(通过使用Mutex),可以在多线程环境中使用。
  • 简单:用户不需要为每个类型手动创建池,可以使用ObjectPool::new函数从池中创建对象。
  • 灵活:用户可以配置池以使用自定义的生成函数(见#[derive(ObjectPool)]中的属性)或者直接使用Default特质来创建新对象。

安装

将以下内容添加到您的Cargo.toml文件中

[dependencies]
derivable-object-pool = "0.1.1"

使用

未指定任何属性时,池将使用Default特质来创建新对象

use derivable_object_pool::prelude::*;

#[derive(Default, ObjectPool)]
struct Test(i32);

fn main() {
    let mut obj = Test::new();
    obj.0 += 1;
    assert_eq!(obj.0, 1);
    drop(obj); // obj is returned to the pool
    assert_eq!(Test::pool().len(), 1);
    let mut obj = Test::new();
    assert_eq!(Test::pool().len(), 0);
    assert_eq!(obj.0, 1); 
}

或者您可以使用#[generator]属性指定一个自定义的生成函数

use derivable_object_pool::prelude::*;

#[derive(ObjectPool)]
#[generator(Test::new_item)]
struct Test(i32);

impl Test {
    fn new_item() -> Self {
        Test(10)
    }
}

fn main() {
    let mut obj = Test::new();
    obj.0 += 1;
    assert_eq!(obj.0, 11);
    drop(obj); // obj is returned to the pool
    assert_eq!(Test::pool().len(), 1);
    let mut obj = Test::new();
    assert_eq!(Test::pool().len(), 0);
    assert_eq!(obj.0, 11); 
}

文档

文档可以在这里找到。

许可证

本项目受双MIT/Apache-2.0许可证许可。更多信息,请参阅LICENSE-APACHELICENSE-MIT

依赖关系

~280–730KB
~17K SLoC