Rust Hyper server在将来返回Async::NotReady时断开连接
我正在尝试使用future对请求运行一个具有异步响应的超级服务器。当调用future的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
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;
}
}