nee*_*vek 0 nonblocking rust async-await
我对非阻塞 IO 库epoll及其高级抽象有经验libuv,因此当我开始学习 Rust 时,我寻找 Rust 等效项并找到了 Mio。Mio 的工作方式符合我对非阻塞 IO 的理解,并且对我来说很熟悉。我可以轻松地使用这种 API 来使用多个线程甚至单个线程构建高性能服务器应用程序。
Rust 1.39 带来了async/await语法。我读过一些关于它的文章和文档,感觉就像协程。我知道.await可以用来让 CPU 在同一线程中执行其他操作,但是没有简单的方法可以动态调度代码在该线程中运行,它不能以事件方式工作epoll,比如我可以注册提前发生事件并在这些事件发生时收到通知。
async打开和读取文件的/示例await对我来说没有意义,因为在该示例中,我除了等待内容可用之外.await什么都不做,所以我仍然处于阻塞状态,根本不是异步的。
如果我使用像 Mio 或unsafe 这样的非阻塞 IO epoll,我还需要async/吗await?如果不是,什么情况下应该使用async/ await?
\n\n\n如果我使用像 Mio 或unsafe 这样的非阻塞 IO
\nepoll,我还需要async/吗await?
不,您不需要async/ await:您的代码可以执行您想要的操作,您对它感到满意,并且它不使用async/ await。没有明显的理由让您更改代码。您可以通过多种方式陈述这一点:
\n\n\n\n\nMio 按照我理解的方式工作
\n
\n\n\n\n\n[澪]我很熟悉。
\n
\n\n\n我可以轻松使用这种API
\n
关于函数也可以提出同样风格的问题。函数并不是严格必需的,因为我们可以在使用函数的任何地方复制粘贴代码。该代码做了某人想要的事情,某人对此感到满意,并且它没有使用函数。该开发人员没有明显的理由更改其代码。
\n\n是的\xe2\x80\x94 一般而言,大多数 Rust 开发人员在尝试编写异步代码时(甚至可能不应该使用 / )都会使用async/ 。await这些关键字大多是创造未来的语法糖。在引入特殊语法之前,Future 已经在 Rust 生态系统中存在了很长一段时间,因此甚至不需要语法。然而,它确实使创建未来变得更简单。
期货是最终由执行者驱动的异步工作的抽象。可以放在抽象之下的东西之一是基于事件的 IO 库。库通知执行器库管理的 IO 句柄之一发生了某些变化,这会导致执行器恢复未来,这可能会意识到它已经完成。
\n\nMio 由一些最常见的 futures 相关 crate 使用,例如tokio或async-std。Mio 文档甚至建议将其与 future 一起使用:
\n\n\n\n\n这是一个低级库,如果您正在寻找更容易上手的东西,请参阅 Tokio。
\n
也可以看看:
\n\n\n