< 返回版块

freshman 发表于 2024-07-16 17:30

当我使用tokio::spawn()建立多个永不退出的任务的时候,假如其中一个任务异常宕机了,我怎么才能捕获这个panic或者得知这个任务已经退出从而重启任务呢?我尝试过使用panic::catch_unwind()包裹异步任务,但是由于任务里有await异步操作也导致这个函数无法使用

评论区

写评论
alexlee85 2024-07-18 13:09

使用futures::FutureExt 里面的catch_unwind()

use std::time::Duration;

use futures::FutureExt;

#[tokio::main]
async fn main() {
    loop {
        let task = tokio::spawn(async move {
            let mut cnt = 1;
            loop {
                if cnt >= 5 {
                    panic!("ooo, paniced");
                } else {
                    println!("count is {cnt} now");
                    cnt += 1;
                    tokio::time::sleep(Duration::from_secs(1)).await;
                }
            }
        });

        let unwind = task.catch_unwind().await;

        if let Ok(Err(err)) = unwind {
            println!("unwind panic happen {err:?}, loop will restart task");
        }
    }
}
ianfor 2024-07-16 19:10

use tokio::task;
use std::io;
use std::panic;

#[tokio::main]
async fn main() -> io::Result<()> {
    let join_handle: task::JoinHandle<Result<i32, io::Error>> = tokio::spawn(async {
        panic!("boom");
    });

    let err = join_handle.await.unwrap_err();
    assert!(err.is_panic());
    Ok(())
}

1 共 2 条评论, 1 页