如何将 tokio::timer::Timeout 与 Future::wait 一起使用?
How do I use 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);
}
如果我 运行 我的 future_with_timeout
和 tokio::run()
,它会按预期工作。
但是,在 task_with_timeout
上调用等待会导致 task
将来出现错误:
thread 'main' panicked at 'delay errored; err=Error(Shutdown)'
而不是得到
Timeout hit Error(Elapsed)
我不明白使用 tokio::run()
和 wait()
之间的区别。
如何使用 wait
使代码工作?
我不会,你也可能不能。
阅读 timer
模块的文档:
These types must be used from within the context of the Runtime
or a timer context must be setup explicitly. See the tokio-timer crate for more details on how to setup a timer context.
在线程之后,我们得到 tokio_timer::with_default
which requires a Tokio executor and a Timer
. The executor uses the Enter
类型,它本身需要一个未来来阻止。
所有这一切都表明 Tokio 的未来可能依赖于纯 executor 之外的功能。如果我正确理解了这些术语(很可能我没有理解),那么这些功能是由 reactor 提供的。调用 wait
对此一无所知。
另请参阅:
我正在尝试使用 tokio:timer:Timeout
:
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_timeout
和 tokio::run()
,它会按预期工作。
但是,在 task_with_timeout
上调用等待会导致 task
将来出现错误:
thread 'main' panicked at 'delay errored; err=Error(Shutdown)'
而不是得到
Timeout hit Error(Elapsed)
我不明白使用 tokio::run()
和 wait()
之间的区别。
如何使用 wait
使代码工作?
我不会,你也可能不能。
阅读 timer
模块的文档:
These types must be used from within the context of the
Runtime
or a timer context must be setup explicitly. See the tokio-timer crate for more details on how to setup a timer context.
在线程之后,我们得到 tokio_timer::with_default
which requires a Tokio executor and a Timer
. The executor uses the Enter
类型,它本身需要一个未来来阻止。
所有这一切都表明 Tokio 的未来可能依赖于纯 executor 之外的功能。如果我正确理解了这些术语(很可能我没有理解),那么这些功能是由 reactor 提供的。调用 wait
对此一无所知。
另请参阅: