3 个版本
使用旧的 Rust 2015
0.0.2 | 2019年9月4日 |
---|---|
0.0.1 | 2018年10月24日 |
0.0.0 | 2018年10月23日 |
#991 在 并发
39KB
578 代码行
Dynpool
Dynpool 是一个轻量级、灵活且可伸缩的线程管理器。该池旨在最小化开销,无需昂贵的锁或额外的管理线程。您可以自己添加工作队列,也可以不添加!
要使用 dynpool,您只需要一个 System
的实现。池将重复调用来自多个线程的 System::work
,每个线程都有自己的数据对象。与要求您从外部调整池的大小不同,dynpool
将不断从 System::scale
查询工作线程数。这实际上更快,因为简单的 scale
实现可以内联到工作线程中!您可以在后台运行系统,并通过 Pool
对象进行控制,或者在前台运行以利用当前线程。
struct Printer(Instant);
impl System for Printer {
type Data = String;
// How many threads? The pool will scale up over time!
fn scale(&self) -> Scale {
let time = self.0.elapsed();
let ms = time.as_secs() * 1000 + time.subsec_millis() as u64;
match ms {
0..=200 => Scale::active(1),
201..=400 => Scale::active(2),
401..=600 => Scale::active(3),
601..=800 => Scale::active(4),
_ => Scale::shutdown(),
}
}
// Pick a string for each thread.
fn init(&self, index: usize) -> String {
match index {
0 => "Hello",
1 => "Hola",
2 => "Bonjour",
3 => "Ciao",
_ => unreachable!(),
}.to_owned()
}
// Do work on several threads!
fn work(&self, text: &mut String) -> Decision {
println!("{}", text);
*text += " Again";
sleep(Duration::from_millis(100));
Decision::Again
}
}
fn main() {
Pool::start_fg(Printer(Instant::now())).unwrap();
println!("This is the end!");
}
还有用于简洁地更改和构建系统的内置函数。
let workers = func_worker(|index| {
println!("New worker #{}", index);
move || {
println!("Hello from #{}", index);
Decision::Again
}
});
let sys = with_threads(workers, 10);
let end_time = Instant::now() + Duration::from_millis(500);
Pool::start_fg(shutdown_after(sys, end_time)).unwrap();
依赖项
~0.6–0.8MB
~11K SLoC