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



我正在尝试使用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);
}

如果我用tokio::run()运行我的future_with_timeout,它会按预期工作。

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

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

而不是得到

Timeout hit Error(Elapsed)

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

游乐场链接

如何使用wait使代码工作?

我不会,而且你可能就是做不到

阅读timer模块的文档:

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

按照线程,我们进入tokio_timer::with_default需要 Tokio 执行器和Timer.执行器使用Enter类型,该类型本身希望阻止未来。

所有这些都是说,东京的未来可能依赖于纯粹执行者之外的功能。如果我正确理解了这些术语(很可能我理解不正确(,这些功能是由反应堆提供的。打电话给wait对此一无所知。

另请参阅:

  • 如何在稳定的 Rust 中同步返回在异步 Future 中计算的值?

最新更新