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);

无运行时依赖项