5 个稳定版本
1.3.0 | 2022年11月2日 |
---|---|
1.2.0 | 2021年9月10日 |
1.1.0 | 2021年9月10日 |
1.0.1 | 2020年5月21日 |
在 内存管理 类别中排名 #233
每月下载量 15,738
用于 102 个crates (直接使用4个)
15KB
199 行
defer-drop
一个实用类型,允许您将数据的延迟释放到后台线程。受 Aaron Abramov 的这篇文章 启发。
简要说明
// examples/demo.rs
println!("Allocating a ridiculously large vector");
let vec1: Vec<Vec<String>> = repeat_with(|| {
repeat_with(|| "Hello, World".to_string())
.take(1000)
.collect()
})
.take(1000)
.collect();
println!("Duplicating that vector");
let vec2 = vec1.clone();
// Drop vec1 in a background thread
let defer_vec1 = DeferDrop::new(vec1);
println!("Dropping the vectors");
let vec1_timer = timer(move || drop(defer_vec1));
let vec2_timer = timer(move || drop(vec2));
println!("Duration of deferred drop: {:?}", vec1_timer);
println!("Duration of foreground drop: {:?}", vec2_timer);
在我的机器上,这会打印
Allocating a ridiculously large vector
Duplicating that vector
Dropping the vectors
Duration of deferred drop: 178µs
Duration of foreground drop: 102.5139ms
您可以使用以下命令运行此示例
cargo run --example demo
摘要
defer-drop 提供了一个包装类型,当释放时,将内部值发送到全局后台线程进行释放。在值释放需要很长时间的情况下很有用(例如,可能阻塞在关闭上的Windows文件,或必须大量递归搜索自己的大型数据结构)。
注意
仔细考虑此模式是否适用于您的用例。像所有工作线程抽象一样,将值发送到另一个线程有其自身的成本,因此只有在性能分析表明这是一个性能提升时才应这样做。
只有一个全局工作线程。释放的值将排队在一个无界通道中,由该线程消费;如果您产生的垃圾比线程能处理的还多,这将导致无界内存消耗。目前没有方法让线程在超出负荷时发出信号或阻塞。
所有标准的非确定性线程注意事项都适用于此。对象将保证按照通过通道接收的顺序销毁,这意味着来自单个线程的对象将按顺序销毁。但是,对于来自不同线程的交错值的顺序没有保证。此外,对于值在释放前将排队多长时间,或者它们是否会被释放,也没有保证。如果主线程在所有释放完成之前终止,它们将被静默丢失(就像通过 mem::forget
。这种行为完全取决于操作系统的线程调度器。没有方法可以接收一个信号来指示特定对象何时被释放。
依赖项
~335–560KB
~10K SLoC