如何使用Future :: wait使用tokio :: timer :: Timeout?

时间:2019-08-14 09:34:00

标签: rust rust-tokio

我正在尝试使用tokio:timer:Timeout在RPC请求中引入超时:

use std::time::{Duration, Instant};
use tokio::prelude::*;
use tokio::timer::Delay;

fn main() {
    let when = Instant::now() + Duration::from_millis(4000);
    let task = Delay::new(when)
        .and_then(|_| {
            println!("Hello world!");
            Ok(())
        })
        .map_err(|e| panic!("delay errored; err={:?}", e));

    let task_with_timeout = task
        .timeout(Duration::from_millis(3000))
        .map_err(|e| println!("Timeout hit {:?}", e));
    let _ = task_with_timeout.wait().expect("Failure");
    // tokio::run(task_with_timeout);
}

如果我将future_with_timeouttokio::run()一起运行,它将按预期运行。

但是,在task_with_timeout上调用wait会导致task将来出现错误:

thread 'main' panicked at 'delay errored; err=Error(Shutdown)'

而不是得到

Timeout hit Error(Elapsed)

我不明白使用tokio::run()wait()之间的区别。

Playground link

如何使用wait使代码正常工作?

1 个答案:

答案 0 :(得分:1)

我不会,而你只是不能

阅读timer模块的文档:

  

这些类型必须在Runtime的上下文中使用,或者必须显式设置计时器上下文。有关如何设置计时器上下文的更多详细信息,请参见tokio-timer crate

在线程之后,我们进入tokio_timer::with_default,它需要一个Tokio执行器和一个Timer。执行程序使用Enter类型,它本身希望将来继续受阻。

所有这些都是说Tokio的期货可能依赖于纯 executor 之外的功能。如果我正确理解了这些术语(可能我不太理解),则这些功能由 reactor 提供。调用wait对此一无所知。

另请参阅: