【问题标题】:Not using Async in Rocket 0.5+?不在 Rocket 0.5+ 中使用异步?
【发布时间】:2021-11-29 18:29:18
【问题描述】:

我读过Rocket v0.5 现在使用 Tokio 运行时来支持异步。我知道,当我们有大量(如数百或数千个)并发 IO 绑定请求时,异步可以提供出色的可扩展性。但是许多 Web/REST 服务器应用程序根本不属于该类别,在这种情况下,我觉得 Async 只会使事情复杂化。抱歉,如果这听起来像个愚蠢的问题,但是使用 Rocket 0.5+,我仍然可以像以前一样编写传统的非异步代码吗? Rocket 0.5+ 中的异步支持是否意味着我们将获得async fn 处理程序的异步行为?如果是这样,Tokio 运行时是否还会在非异步代码中发挥作用?

【问题讨论】:

  • rocket 0.4 使用了一种异步形式,任何真正的服务器都会使用线程、轮询或任何其他方法。您需要异步服务器,想象一下一个客户端为一个客户端服务。 Rocker 0.5 只使用 rust 内置的异步功能。
  • @Stargateur 我不同意服务器需要异步。服务器实现的“经典”方式是它们有一个线程池,当请求到来时,服务器专用该池中的一个线程来从头到尾为请求提供服务。这样,您仍然可以并行处理多个请求。这就是有多少流行的 Web 服务器(如 Apache、Tomcat 等)已经运行了这么多年。
  • 正如我所说,这也是异步的一种形式。
  • 异步主要是指非阻塞;同步请求不能成为异步请求(无需干预),但异步请求可以立即(以阻塞方式)解决以使其同步。我认为它们并不相互排斥。

标签: rust rust-tokio rust-rocket


【解决方案1】:

当然可以。

查看网页中的第一个examples

#[get("/")]
fn index() -> &'static str {
   "Hello, world!"
}

任何地方都没有async/await。 Rocket5 最棒的地方在于,您可以选择同步的视图 哪些是异步的,只需将它们设置为同步即可,您可以根据需要将它们混合在一起。

例如,这将起作用:

#[get("/sync")]
fn index1() -> &'static str {
   "Hello, sync!"
}
#[get("/async")]
async fn index2() -> &'static str {
   "Hello, async!"
}

Rocket 运行时在后台都是异步的,但根本不需要向您的视图处理程序公开。当运行非异步处理程序时,就好像 Rocket 使用了spawn_blocking()

【讨论】:

  • 这是否意味着我可以在我的非异步处理程序中可靠地使用线程局部变量?
  • @at54321:您的非异步处理程序将一次性运行:在任何地方都没有await,因此每次运行时,整个代码都将在同一个线程上执行。当然,不能保证每次运行处理程序时它都是同一个线程,但对于 rocket-0.4 也是如此。
  • 谢谢,罗德里戈!这就说得通了。我只是没有看到文档中明确提到的那些事情。
  • @at54321 对于 Rocket 5 中异步的所有炒作,文档和示例仍然大多是非异步的。我认为这是一个好主意:那些需要异步的人无论如何都会找到它;那些不这样做的人会阅读更简单的文档。
  • 这是有道理的。一般来说,有这样的 option 是很好的——在你真正需要的时候/在哪里使用异步。我唯一担心的是,所有这些异步的东西都让 Rocket crate 变得更大(这导致更大的二进制文件、更慢的构建等),但在我看来,大多数人认为这样的担忧是愚蠢的。对我来说,最好是所有异步的东西都是可选的,但也许这太难实现了,或者他们根本不觉得这很重要。
猜你喜欢
  • 2023-01-14
  • 2020-08-03
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多