5 个版本

使用旧的 Rust 2015

0.1.4 2017年1月13日
0.1.3 2015年5月27日
0.1.2 2015年4月25日
0.1.1 2015年4月10日
0.1.0 2015年4月10日

#358 in 内存管理

Download history 270/week @ 2024-02-25 97/week @ 2024-03-03 289/week @ 2024-03-10 243/week @ 2024-03-17 157/week @ 2024-03-24 229/week @ 2024-03-31 59/week @ 2024-04-07 217/week @ 2024-04-14 129/week @ 2024-04-21 144/week @ 2024-04-28 119/week @ 2024-05-05 97/week @ 2024-05-12 114/week @ 2024-05-19 174/week @ 2024-05-26 184/week @ 2024-06-02 47/week @ 2024-06-09

531 每月下载量
8 个Crates中使用(通过 sozu-command-lib

MIT 许可证

13KB
240

一组可重用值

一个Rust库,提供用于管理可重用值的数据池结构。池中的所有值在创建池时初始化。值可以随时从池中取出。当取出的值超出作用域时,值将返回到池中,并在以后可用。

Build Status

用法

要使用 pool,首先将以下内容添加到您的 Cargo.toml

[dependencies]
pool = "0.1.3"

然后,将其添加到您的crate根目录

extern crate pool;

功能

  • 简单
  • 无锁:值可以跨线程返回到池中
  • 存储类型化值和/或内存块

lib.rs:

预初始化值的存储。

在需要时可以检出值,操作它们,并在超出作用域时自动返回到池中。当处理创建成本高昂的值时可以使用。基于对象池模式

示例

use pool::{Pool, Dirty};
use std::thread;

let mut pool = Pool::with_capacity(20, 0, || Dirty(Vec::with_capacity(16_384)));

let mut vec = pool.checkout().unwrap();

// Do some work with the value, this can happen in another thread
thread::spawn(move || {
    for i in 0..10_000 {
        vec.push(i);
    }

    assert_eq!(10_000, vec.len());
}).join();

// The vec will have been returned to the pool by now
let vec = pool.checkout().unwrap();

// The pool operates LIFO, so this vec will be the same value that was used
// in the thread above. The value will also be left as it was when it was
// returned to the pool, this may or may not be desirable depending on the
// use case.
assert_eq!(10_000, vec.len());

额外字节存储

池中的每个值都可以填充任意数量的字节,可以将其作为切片访问。如果实现类似缓冲池,这很有用。元数据可以存储为 Pool 值,而字节数组可以存储在填充中。

多线程

从池中检出值需要池的可变引用,因此不能在多个线程之间并发发生,但将值返回到池是线程安全的和无锁的,所以如果池中的值是 Sync,则 Checkout<T> 也是 Sync

在多个线程之间共享单个池的最简单方法是将 Pool 包裹在互斥锁中。

无运行时依赖项