我正在将Forward
的未来从Stream
重写为Sink
,从而在接收新项目时增加了超时时间。
我在Forward
结构中使用了Delay
来跟踪超时,但是结果始终是Error(Shutdown)
。
从timer::Error
文档中,我看到只有在删除了future时才应返回,但事实并非如此,因为它仍包含在主结构中。
这是一个最小的测试示例,从中可以得到相同的结果。
extern crate tokio; // 0.1.20
use std::thread::sleep;
use std::time::{Duration, Instant};
use tokio::prelude::*;
use tokio::timer::Delay;
fn main() {
let mut delay = Delay::new(Instant::now() + Duration::from_millis(3000));
sleep(Duration::from_millis(1000));
match delay.poll() {
Ok(Async::NotReady) => println!("Not ready"),
Ok(Async::Ready(v)) => println!("Ready: {:?}", v),
Err(e) => println!("{:?}", e),
}
}
您可以看到一个运行示例here
我希望会收到Async:Ready(v)
为v
的{{1}}。
答案 0 :(得分:0)
一个Delay
与一个Timer
一起工作,这里的错误表明它无法向一个人注册。尽管文档有时会假设您在tokio上下文中工作,但they do mention this requirement:
必须在
Runtime
的上下文中使用这些类型,或者必须显式设置计时器上下文。有关如何设置计时器上下文的更多详细信息,请参见tokio-timer
条板箱。
如果您想避免该错误,则足以在一个任务中运行它:
fn main() {
tokio::run(futures::future::lazy(|| {
let mut delay = Delay::new(Instant::now() + Duration::from_millis(3000));
sleep(Duration::from_millis(1000));
// "Not ready"
match delay.poll() {
Ok(Async::NotReady) => println!("Not ready"),
Ok(Async::Ready(v)) => println!("Ready: {:?}", v),
Err(e) => println!("{:?}", e),
}
Ok(())
}))
}
但是,即使您等待超过3000毫秒,这也不会转换为就绪状态。如果要使用运行时计时器,则必须将其作为任务生成:
fn main() {
// "Ready: ()"
tokio::run(
Delay::new(Instant::now() + Duration::from_millis(3000))
.map(|v| println!("Ready: {:?}", v))
.map_err(|e| println!("{:?}", e)),
)
}