如何使用 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 编写异步方法?的主要内容,如果未能解决你的问题,请参考以下文章