【问题标题】:How to unblock a future thread and return results如何解锁未来的线程并返回结果
【发布时间】:2019-10-07 06:39:29
【问题描述】:

我决定使用 hyper create 来构建一个读取 POST 方法的主体数据的服务器。 How do I synchronously return a value calculated in an asynchronous Future in stable Rust? 解释了我正在寻找的部分内容,但我不想使用tokio::runfuture::lazy,因为根据我的理解,超级使用 Tokio 和期货,超级主体返回一个流。我想要完成的是找到其他处理流的方法,并获得有关超Request 方法的更多知识。

在第一种方法中,我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】:

我相信您已经发现,在期货上调用 wait()是一种反模式,并且总体上违背了异步 IO 的目的(因为您正在阻塞线程 - 因此执行者 - 这样做)。

hyper 路由接受一个实现 IntoFuture 的返回,这是一种以一揽子方式为 Option<T>Result<T, E> 实现的类型。因此,您实际编写的内容根本不需要阻塞 - 您只需要像这样组合期货:

if Method::POST == req.method() {
   req.into_body().concat2().map(|_body| {
       Response::new(Body::from("OK: data submitted"))
   })
}

您甚至没有在代码中使用 body 内容,但我假设这是出于 MCVE 的目的。在 map() 组合器中,该值当前显示为 _body 并允许您使用它做任何您想做的事情。

我猜你是因为文档而发现自己在这个角落 - 所有组合器都在 FutureExt 特征对象上;它们本身没有在 FutureStream 特征上定义。因此,在查看 0.2/0.3 文档时,它们不会立即浮出水面,因此您似乎唯一可用的调用是 poll_next()wait()

【讨论】:

  • 谢谢,有没有办法在不使用 map 而是使用其他组合器的情况下返回结果?或使用以下内容:link
  • @Silva 您可以在concat2() 之后使用FutureExt 上的任何组合子,因为concat2 实现了Future。因此,如果您需要用它做更复杂的事情,可以使用各种各样的方法。然而,大多数时候,map()(当你没有链接到另一个未来时)、or_else()(当你试图从错误结果中恢复时)和and_then()(当你链接到另一个未来时)将是最常用的组合子。
  • 关键要点是,无论您决定使用哪种组合子链,都需要返回。 hyper 将通过以正确的方式主动轮询来完成剩下的工作。
猜你喜欢
  • 1970-01-01
  • 2021-01-22
  • 2013-11-23
  • 2015-10-14
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
相关资源
最近更新 更多