3个版本 (有破坏性)
0.4.0 | 2023年3月22日 |
---|---|
0.3.0 | 2022年8月27日 |
0.2.2 | 2022年5月27日 |
0.1.2 |
|
#37 在 #panic
用于 rework
18KB
382 代码行
pandet
一个轻量级库,可以帮助检测派生异步任务的失败,而不需要使用 .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