Как сделать таймаут работающего кода?

Я пытаюсь запустить какой-то фрагмент кода в течение не более 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. Я уверен, что что-то упускаю, но не могу понять.


person vuk    schedule 04.04.2019    source источник
comment
Перекрестная проблема в github   -  person Stargateur    schedule 04.04.2019
comment
@Stargateur да, это я   -  person vuk    schedule 04.04.2019
comment
Перекрестный вопрос / проблема полностью в порядке, я просто связываю их, чтобы не терять время, если у какой-либо стороны есть ответ.   -  person Stargateur    schedule 04.04.2019
comment
У вас есть таймер будущего, который завершает бесконечный цикл. Затем Tokio звонит и ждет функция опроса таймера, которая, в свою очередь, вызывает и ждет вашего бесконечного цикла.   -  person so61pi    schedule 04.04.2019