如何使用 Tokio 编写异步方法?

Posted

技术标签:

【中文标题】如何使用 Tokio 编写异步方法?【英文标题】:How do I write an async method with Tokio? 【发布时间】:2020-05-22 12:14:02 【问题描述】:

我正在尝试编写一个库来连接到远程服务器并交换数据。我在 C++ 中使用 Boost::Asio 做到了这一点,并试图用 Rust 做同样的事情。

我遇到的一个问题是从 Asio 映射概念,例如 async_write/read 到 Tokio,首先是看似所有 Tokio 示例都要求我将 main() 替换为 async main(),而我想将我所有的异步代码封装在结构和相关的实现中。

是否可以在不替换main() 的情况下使用Tokio? mio 可能是唯一的方法吗?

【问题讨论】:

你可以创建一个 Tokio reactor 并提交一个 future 来处理,但有什么意义呢?您只是手动编写 proc 宏为您编写的代码。这里似乎有更深的误解。 也许吧。使用 Asio,我有一个线程池并让我的事件循环在其上运行,我不需要替换 main。使用 Rust 我会这样做,这让我感到困惑。 您可以手动创建运行时:docs.rs/tokio/0.2.21/tokio/runtime/index.html,这就是 tokio 主宏在后台执行的操作。它仅适用于大量应用程序,尤其是样板示例。 reactor 只是管理 io 调用进入操作系统。运行时是完整的线程池包,用于在其上运行任务、反应器和计时器管理。 这能回答你的问题吗? How do I synchronously return a value calculated in an asynchronous Future in stable Rust? 【参考方案1】:

您可以使用Runtime::new() 手动创建运行时,这是 tokio 主宏在后台执行的操作。它仅适用于大量应用程序,尤其是样板示例。所以宏自动化了简单的情况。

但是,根据您的库的上下文,提供基于未来的 API,然后让应用使用者设置运行时可能更符合习惯。

【讨论】:

以上是关于如何使用 Tokio 编写异步方法?的主要内容,如果未能解决你的问题,请参考以下文章

硬核!Rust异步编程方式重大升级:新版Tokio如何提升10倍性能详解

如何将异步函数存储在结构中并从结构实例中调用它?

Tokio教程之深入异步

深入浅出Rust异步编程之Tokio

如何将 Tokio 线程池限制为一定数量的本机线程?

Tokio教程之select