Hop*_*ope 9 concurrency asynchronous rust async-await rust-tokio
像tokio这样的 Rust 异步运行时提供了许多标准函数的“异步”副本,包括一些文件 IO 函数,它们基本上只是通过调用相应的阻塞任务(在新线程上?)来工作。此类函数的示例有tokio::fs::create_dir_all, tokio::fs::read_dir, tokio::fs::read, ...
所有这些功能有什么优点?为什么我应该更喜欢在异步上下文中使用它们而不是标准阻塞函数?如果我是.await他们的结果,有什么收获吗?
一个示例是异步 Web 路由,它根据查询返回某个文件的内容(使用Rocket):
\n#[get("/foo/<query>")]\nasync fn foo(query: &str) -> Option<String> {\n let file_path = // interpret `query` somehow and find the target file\n tokio::fs::read_to_string(file_path).await.ok()\n // ^ Why not just `std::fs::read_to_string(file_path).ok()`?\n}\nRun Code Online (Sandbox Code Playgroud)\nasync/.await我理解套接字 IO 或延迟任务(线程睡眠)的好处,但在这种情况下,这对我来说似乎毫无意义。但相反的 \xe2\x80\x94 这使得在代码中解决更复杂的任务变得更加困难(例如,在目录列表中搜索文件时使用流)。
我猜您正在使用相当快的驱动器读取本地文件系统上的小文件。如果是这样的话,那么使用async这些函数的版本可能就没有什么意义了。
如果一半的 HTTP 请求需要从文件系统读取,那么您可能会开始注意到运行时等待阻塞 IO 的时间较长。这实际上取决于您的应用程序的性质。也许你有一个线程?也许你有很多?
然而,在一些极端情况下,文件系统可能会慢到成为一个真正的大问题。这是两个极端的极端情况:
create_dir_all。虽然这是阻塞的,但您的服务基本上没有响应。现在,如果您正在编写一个公开asyncAPI 的库,则不能对底层文件系统或其支持硬件做出假设,并且应该使用非阻塞 IO。
| 归档时间: |
|
| 查看次数: |
6373 次 |
| 最近记录: |