【问题标题】:How to asynchronously read a file?如何异步读取文件?
【发布时间】:2015-12-18 17:14:58
【问题描述】:

我可以创建一个单独的线程来充当 I/O 队列,但我不确定这是否是最好的方法。它看起来是最好的。

我不知道如何使用mio 加载本地文件。

【问题讨论】:

  • 您找不到如何使用 mio 异步读取文件的原因是因为它被明确列为该项目的非目标。 ^_^
  • 关于 Rust 不能说太多,但从操作系统的角度来看(这对于绝大多数(如果不是全部)主流系统都是如此)创建线程是迄今为止最好的解决方案.异步 I/O 要么在所有主流操作系统上实现得很差、没用,要么根本不工作(不管它们声称什么)。
  • 你可以试试madviseMADV_WILLNEED。在 Rust 中,它将位于 libc 板条箱中 (crates.io/crates/libc; rust-lang-nursery.github.io/libc/x86_64-unknown-linux-gnu/libc/…)。

标签: rust


【解决方案1】:

使用 tokio::fs::read:

use tokio::prelude::Future;

fn main() {
    let task = tokio::fs::read("/proc/cpuinfo").map(|data| {
        // do something with the contents of the file ...
        println!("contains {} bytes", data.len());
        println!("{:?}", String::from_utf8(data));
    }).map_err(|e| {
        // handle errors
        eprintln!("IO error: {:?}", e);
    });
    tokio::run(task);
}

【讨论】:

    【解决方案2】:

    我建议自己简单地分离另一个线程。 io 不打算这样做,并且制作自己的异步加载器可以让您完全控制读/写发生的方式和时间,如果性能是您的目标,这很重要(如果您需要,我会想象它是异步磁盘 I/O)。您可以选择是写入/读取单个字节、单行还是累积块并写入这些块。如果您的应用程序在其他时间等待其他东西,例如网络,您可以选择写入磁盘,例如。

    【讨论】:

    • 您能否引用一些来源表明标准库中的 io 不打算支持这一点?
    猜你喜欢
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2021-08-07
    • 2019-01-13
    • 2012-12-07
    相关资源
    最近更新 更多