如何解锁未来的线程并返回结果

问题描述 投票:0回答:1

我决定使用超级创建来构建一个服务器,该服务器读取POST方法的主体数据。以下link解释了我正在寻找的一部分内容,但我不想使用tokio::runfuture::lazy,因为根据我的理解,超级用户使用东京期货和期货,并且超级机构返回流。因此,我试图完成的工作是找到其他处理流的方法,并再次获得有关超级请求方法的更多知识。

[在第一种方法中,我concat2然后调用waitwait阻止当前线程,因此我的代码挂起。

if Method::POST == req.method() {
    let body = req.into_body().concat2().wait();
    // convert to json and do something with the data.
    Ok(Response::new(Body::from("OK: data submitted")))
}

[在第二种方法中,我尝试使用polland_then,但我总是得到NotReady。结果类型为futures::poll::Async<hyper::Chunk>

if Method::POST == req.method() {
    let body = req.into_body().concat2().poll().and_then(|e| {
        // do something
        Ok(e)
    });

    match body {
        Ok(e) => println!("{:#?}", e),
        Err(r) => println!("{:#?}", r),
    };
    Ok(Response::new(Body::from("")))
}
  1. 如何解除当前线程的阻塞并返回结果?
  2. 我如何轮询然后返回结果,?

[如果可能,请说明如何处理futures::poll::Asyncwait()的良好做法。目前,async / await在Rust中不稳定,因此无法使用。

rust hyper
1个回答
1
投票

[我确定您已经发现,在期货上调用wait() 是一种反模式并破坏了整体异步IO的目的(因为您正在阻塞线程,从而使执行者处于阻塞状态)这样)。

hyper路由接受实现IntoFuture的返回值,该返回值以覆盖方式为IntoFutureOption<T>实现。因此,您实际编写的内容根本不需要阻止-您只需要像这样组合期货:

Result<T, E>

您甚至没有使用

代码中的if Method::POST == req.method() { req.into_body().concat2().map(|_body| { Response::new(Body::from("OK: data submitted")) }) } 内容,但我假设这是出于MCVE的目的。在body组合器内部,该值当前显示为map(),并允许您使用它进行任何操作。

[我猜您由于文档而发现自己处在这个角落–所有组合器都在_body特征对象上;它们不是在FutureExtFutureExt特征本身上定义的。结果,当查看0.2 / 0.3 doc时,它们不会立即浮出水面,因此,您看来唯一可用的呼叫是FutureStream

© www.soinside.com 2019 - 2024. All rights reserved.