#async-task #async #panic #fail-fast

pandet

一个轻量级库,帮助处理分离的异步任务中的panic

3个版本 (有破坏性)

0.4.0 2023年3月22日
0.3.0 2022年8月27日
0.2.2 2022年5月27日
0.1.2 2022年4月30日

#37#panic


用于 rework

MIT 许可证

18KB
382 代码行

pandet

version documentation

一个轻量级库,可以帮助检测派生异步任务的失败,而不需要使用 .await 来处理它们的句柄。当您需要启动大量分离的任务,但希望在发生panic时快速失败时非常有用。

use pandet::*;

let detector = PanicDetector::new();

// Whichever async task spawner
task::spawn(
    async move {
        panic!();
    }
    .alert(&detector) // 👈 Binds the detector so it is notified of any panic from the future
);

assert!(detector.await.is_some());

!Send 任务实现了 LocalAlert 特性

use pandet::*;

let detector = PanicDetector::new();

task::spawn_local(
    async move {
        // Does some work without panicking...
    }
    .local_alert(&detector)
);

assert!(detector.await.is_none());

通过 PanicMonitor 可以实现更精细的控制,它就像一个警报流。当发生panic时,您还可以向检测器/监控器传递一些消息

use futures::StreamExt;
use pandet::*;

// Any Unpin + Send + 'static type works
struct FailureMsg {
    task_id: usize,
}

let mut monitor = PanicMonitor::<FailureMsg>::new(); // Or simply PanicMonitor::new()
for task_id in 0..=10 {
    task::spawn(
        async move {
            if task_id % 3 == 0 {
                panic!();
            }
        }
        // Notifies the monitor of the panicked task's ID
        .alert_msg(&monitor, FailureMsg { task_id })
    );
}

let cnt = 0;
while let Some(Panicked(msg)) = monitor.next().await {
    cnt += 1;
    assert_eq!(msg.task_id % 3, 0);
}
assert_eq!(cnt, 4);

依赖

~1MB
~15K SLoC