2 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2014年11月17日 |
---|---|
0.0.1 | 2014年11月11日 |
#3 in #resistant
5KB
67 行
Resistant-Taskpool
主要是对
std::sync::TaskPool
的替代品,对panic!
具有抵抗力。
当 std::sync
TaskPool 的任何子任务抛出异常时,它将引发 panic,并且在相同条件下,在回溯过程中也会引发 panic,导致从任何子任务 panic 中终止进程。
此 TaskPool 会启动一个额外的监控任务,并监控所有子任务以检测 panic。如果子任务 panic 或返回,它将在池中启动新的任务。
此外,此 TaskPool 的分配比 std::sync::TaskPool
少,并使用 mpmc 队列在子任务上执行负载均衡,而不是循环遍历所有已启动的任务。
示例
let mut pool = TaskPool::new(8);
// Panic all the created tasks.
for _ in range(0, 8u) {
pool.execute(proc() {
panic!("muahaha");
});
}
// The TaskPool will spawn new tasks to replace the old ones and will
// give out jobs to these new tasks as soon as they are ready.
// Send out new tasks
let (tx, rx) = channel();
for _ in range(0, 8u) {
let tx = tx.clone();
pool.execute(proc() {
tx.send(2u);
});
}
assert_eq!(rx.iter().take(8).sum(), 16);
// Dropping the task pool kills all of the spawned tasks
// but will also not panic if any of the tasks panic from
// their current job before receiving the kill message.
drop(pool);