我正在尝试使用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
上调用wait会导致task
将来出现错误:
thread 'main' panicked at 'delay errored; err=Error(Shutdown)'
而不是得到
Timeout hit Error(Elapsed)
我不明白使用tokio::run()
和wait()
之间的区别。
如何使用wait
使代码正常工作?
答案 0 :(得分:1)
我不会,而你只是不能。
阅读timer
模块的文档:
这些类型必须在
Runtime
的上下文中使用,或者必须显式设置计时器上下文。有关如何设置计时器上下文的更多详细信息,请参见tokio-timer crate。
在线程之后,我们进入tokio_timer::with_default
,它需要一个Tokio执行器和一个Timer
。执行程序使用Enter
类型,它本身希望将来继续受阻。
所有这些都是说Tokio的期货可能依赖于纯 executor 之外的功能。如果我正确理解了这些术语(可能我不太理解),则这些功能由 reactor 提供。调用wait
对此一无所知。
另请参阅: