轮询时延迟将来的返回错误(关闭)

时间:2019-05-24 15:46:44

标签: rust timeout rust-tokio

我正在将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}}。

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)),
    )
}