如果在 Rust 中使用 async,你是否总是需要 async fn main() ?

mon*_*937 4 rust async-await

我正在研究和使用 Rust,async/.await用 Rust 编写一个服务,该服务将从一些 websocket 中提取数据并使用该数据执行某些操作。我的一位同事(他在 C# 中做了类似的“数据提要导入”)告诉我异步处理这些提要,因为线程的性能会很差。

据我了解,要在 Rust 中执行任何异步操作,您需要一个运行时(例如 Tokio)。在检查了我发现的关于该主题的大多数代码后,似乎先决条件是:

#[tokio::main]
async fn main() {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

它提供了管理我们的async代码所需的运行时。我得出这个结论是因为你不能.await在不是async函数或块的作用域中使用。

这引出了我的主要问题:如果打算在 Rust 中使用async,你是否总是需要async fn main()如上所述的?如果是这样,您如何构建同步代码?结构体可以async实现方法和函数吗(或者甚至应该)?

所有这些都源于我编写此服务的最初方法,因为我设想的方式是拥有某种可以处理多个 websocket feed 的结构,如果它们需要异步完成,那么通过这种逻辑,该结构将具有要有async逻辑在里面。

Vla*_*rov 7

不。#[tokio::main]只是一个方便的功能,您可以使用它来创建 Tokio 运行时并启动其中的 main 函数。

如果要显式初始化运行时实例,可以使用Builder. 运行时有一个spawn方法,它接受一个async闭包并在运行时内部执行它,而不是async它本身。这允许您在非代码中的任何位置创建 Tokio 运行时async