如何让一段运行代码超时?

vuk*_*vuk 5 rust rust-tokio

我正在尝试让一些代码最多 运行timeout一段时间。换句话说,我希望一段代码要么在给定的时间限制内完成,要么被中断。

将运行的具体代码将是一个多部分的 http 请求,如果请求未在某个时间范围内完成,我想终止该请求。我已经Timeoutokio-timer板条箱中尝试过,但遇到了一些问题。

use futures::future;

use std::time::Duration;

use tokio::io::Error;
use tokio::prelude::*;
use tokio::runtime::current_thread::Runtime;

fn main() {
    let timeout: u64 = 1000;

    let mut runtime = Runtime::new().unwrap();
    let req_timeout = future::lazy(|| -> Result<String, Error> {
        println!("Start expensive");
        loop {
            //some expensive task
        }
        Ok("finished task".to_string())
    })
    .timeout(Duration::from_millis(timeout));

    let result = runtime.block_on(req_timeout);

    match result {
        Ok(_str) => println!("Task finished"),
        Err(_) => println!("Task interupted"),
    }
}
Run Code Online (Sandbox Code Playgroud)

目前,超时永远不会触发,让调用loop永远执行,而不是被中断并从调用中恢复执行block_on。我确信,我错过了一些东西,但我无法真正弄清楚。