rust eclipse 一定时间后的杀灭作用

l3zydbqr  于 2022-12-19  发布在  Eclipse
关注(0)|答案(1)|浏览(140)

我有一个函数,试图调用一些服务,其中一个(外部服务)有很多问题,从来没有给予任何答案,我想杀死它后,一定的时间。
我想找到任何一个可以设置函数调用超时的板条箱。但是我找不到一个?

fn main() {
    let result = retry::retry(Fixed::from_millis(3000).take(5), || {
            let possibly_return = function_maybe_never_return();
        match possibly_return {
            Ok(kubeconfig) => OperationResult::Ok(kubeconfig),
            Err(err) => Err(err)
        }
    });
    match result {
            Ok(downloaded) => info!("OK !!")
            Err(e) => Error!("Unable to ... after many retries {:?}", e),
    };
}

fn function_maybe_never_return(){
    
}

我想在它上面使用retry crate来重试操作。

gr8qqesn

gr8qqesn1#

如果你有一个像时雄这样的异步运行时,你可以。我有一个类似的需求。我有一个阻塞函数,我需要在设置超时后取消。下面是我是如何做到的。

fn long_running_function() -> Result<()> {
    std::thread::sleep(std::time::Duration::from_secs(1000));
    Ok(())
}

async fn call_long_running_function() {
    tokio::time::timeout(tokio::time::Duration::from_secs(2), tokio::task::spawn_blocking(move ||long_running_function())).await.unwrap()

}

这里,长时间运行的阻塞函数将在tokio::spawn_blocking中调用,而tokio::spawn_blocking又进一步 Package 在tokio::time::timeout()中,因此当超过截止日期时,long_running_function将因Deadline错误而终止。
我相信还有其他更好的方法,这就是我如何让它为我的用例工作的,因为我已经在异步代码库上工作了。

相关问题