Я пытаюсь запустить какой-то фрагмент кода в течение не более timeout
времени. Другими словами, я хочу, чтобы фрагмент кода либо завершился в заданное время, либо был прерван.
Конкретный код, который будет выполняться, будет представлять собой HTTP-запрос, состоящий из нескольких частей, который я хочу завершить, если запрос не будет завершен в установленные сроки. Я пробовал Timeou
из tokio-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"),
}
}
В настоящее время тайм-аут никогда не срабатывает, оставляя loop
работать вечно, вместо того, чтобы быть прерванным и возобновить выполнение с вызова block_on
. Я уверен, что что-то упускаю, но не могу понять.