【问题标题】:async-std write_all does not write data to disk immediatelyasync-std write_all 不会立即将数据写入磁盘
【发布时间】:2022-11-07 21:10:50
【问题描述】:

我在 rust 中有以下代码:

use anyhow::{Result, Error};
use async_std::fs::{File, OpenOptions};
use async_std::io::{ReadExt, WriteExt};

async fn open_log_file() -> Result<File, Error> {
    // Create the file data that will be written to disk.
    let mut file_bytes = [0u8; FILE_MAGIC.len()];
    file_bytes[..].copy_from_slice(FILE_MAGIC.as_bytes());

    // Write the file data to disk.
    let mut f = File::create(FILE_NAME).await.context("unable to create file")?;
    f.write_all(&file_bytes).await.context("unable to write file magic")?;

    // return the file handle
    Ok((f))
}

问题是如果你让它运行,这段代码不会向磁盘写入任何内容。如果您向程序发送终止信号,它最终会将所有数据写入磁盘。如果你再调用 f.write_all() 几次,一些数据最终会以看似任意的数据包的形式进入磁盘。

但是如果你让它挂起,它可能会等待几个小时,直到你关闭程序/关闭文件句柄,你的数据才会被写入磁盘。在 write_all 调用之后调用 f.flush()不是似乎有帮助。

如何确保在堆栈中的某处进行系统调用以实际将数据写入磁盘,同时仍不阻塞线程?让我非常困惑的是,未来将在没有实际将数据写入磁盘的情况下解决。

【问题讨论】:

  • 调用f.flush() 不起作用,但调用f.flush().await 确实起作用,这是我的错误

标签: rust


【解决方案1】:

调用f.flush() 确实有效,但您需要调用f.flush().await。只需调用一个赤裸裸的f.flush() 就可以无错误地编译并无错误地运行,这可能是一个单独的问题,但至少我的代码现在可以按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2011-12-24
    • 2011-12-13
    相关资源
    最近更新 更多