Rust Hyper server在将来返回Async::NotReady时断开连接

Rust Hyper server在将来返回Async::NotReady时断开连接,rust,rust-tokio,hyper,Rust,Rust Tokio,Hyper,我正在尝试使用future对请求运行一个具有异步响应的超级服务器。当调用future的poll方法并返回Async::NotReady时,连接就被丢弃(“丢弃I/O源:0”)。我希望poll方法被多次调用,直到它返回Async::Ready 返回一个异步io未来,它正在做(我猜)同样的事情 为什么future的poll函数只调用一次,为什么在future返回Async::NotReady后hyper会断开连接 示例代码:(超版本为:v0.12.21) 使用未来:{Async,Future,Pol

我正在尝试使用future对请求运行一个具有异步响应的超级服务器。当调用future的
poll
方法并返回
Async::NotReady
时,连接就被丢弃(“丢弃I/O源:0”)。我希望
poll
方法被多次调用,直到它返回
Async::Ready

返回一个异步io未来,它正在做(我猜)同样的事情

为什么future的
poll
函数只调用一次,为什么在future返回
Async::NotReady
后hyper会断开连接

示例代码:(超版本为:v0.12.21)

使用未来:{Async,Future,Poll}; 使用hyper::http::{Request,Response}; 使用hyper::service::service\u fn; 使用hyper::{Body,Server}; fn main(){ 让addr=([127,0,0,1],3335).into(); println!(“启动请求处理程序(在http://{}上侦听)”,addr); hyper::rt::run( 服务器::绑定(&addr) .serve(| |服务| fn(|请求:请求|处理|请求(request.uri().path())) .map_err(| e | println!(“服务器错误:{}”,e)), ); } 类型BoxedResponseFuture=Box; fn handle_请求(路径:&str)->BoxedResponseFuture{ println!(“句柄请求{:?}”,路径); 盒子:新的( ResponseFuture{ready:false} .然后| | |{ 让response=response::new(Body::from(“Success.”to_string()); Ok(回复) }) .或| e |{ 让response=response::new(Body::from(format!(“Error:{:?}”,e)); Ok(回复) }), ) } 结构响应未来{ 准备好了吗, } 为响应未来而实现未来{ 类型项=(); 类型错误=(); fn轮询(&mut self)->轮询{ println!(“投票未来”); 如果自己准备好了{ println!(“未来就绪”); 返回Ok(异步::就绪(()); } println!(“未来未准备就绪”); self.ready=true; Ok(异步::NotReady) } }
Hyper构建在期货板条箱的顶部,并使用其称为“准备就绪”或“拉动”的未来模型,在该模型中,根据需要从期货中拉出值,否则,当值可能准备好拉出时,会通知任务

poll
返回
NotReady
时,当前任务必须注册就绪更改通知,否则任务可能永远无法完成。任何返回
Async
的函数都必须遵循它

换句话说,您应该等待,
poll
可以返回
Ready
或通知当前任务以指示其已准备就绪,然后返回
NotReady

// notify about progress
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
    println!("Poll future");

    if self.ready {
        println!("Future ready");

        return Ok(Async::Ready(()));
    }

    println!("Future not ready");
    self.ready = true;

    // The executor will poll this task next iteration
    futures::task::current().notify();
    Ok(Async::NotReady)
}

// wait until it is Ready
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
    loop {
        println!("Poll future");

        if self.ready {
            println!("Future ready");
            return Ok(Async::Ready(()));
        }

        println!("Future not ready");
        self.ready = true;
    }
}
//通知进度
fn轮询(&mut self)->轮询{
println!(“投票未来”);
如果自己准备好了{
println!(“未来就绪”);
返回Ok(异步::就绪(());
}
println!(“未来未准备就绪”);
self.ready=true;
//执行者将在下一次迭代中轮询此任务
期货::任务::当前().通知();
Ok(异步::NotReady)
}
//等它准备好
fn轮询(&mut self)->轮询{
环路{
println!(“投票未来”);
如果自己准备好了{
println!(“未来就绪”);
返回Ok(异步::就绪(());
}
println!(“未来未准备就绪”);
self.ready=true;
}
}

东京的文件可能会澄清这一点。

谢谢您的简短解释。我想我应该更深入地研究东京的文件。
// notify about progress
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
    println!("Poll future");

    if self.ready {
        println!("Future ready");

        return Ok(Async::Ready(()));
    }

    println!("Future not ready");
    self.ready = true;

    // The executor will poll this task next iteration
    futures::task::current().notify();
    Ok(Async::NotReady)
}

// wait until it is Ready
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
    loop {
        println!("Poll future");

        if self.ready {
            println!("Future ready");
            return Ok(Async::Ready(()));
        }

        println!("Future not ready");
        self.ready = true;
    }
}