【问题标题】:Multiple async writes to the same file in node多个异步写入节点中的同一文件
【发布时间】:2014-10-22 21:21:50
【问题描述】:

我正在使用fs.writeFile(...) 根据用户输入对文件进行修改。我最近遇到了一个错误,其中两个写入请求有效地导致文件被截断。

每个写入操作都必须按照接收到的顺序完成。但是,我不希望用户必须等待写入完成才能继续执行下一个任务。

将异步写入排队的规范方式或流行模块是什么,这样在写入发生时用户不会被阻止做其他工作,并保证不会发生冲突。

此外,如果可能,我希望读取同一文件。

我最初的想法是写一个临时文件然后复制,但这似乎效率不高。

【问题讨论】:

  • 这是一个进程的多次写入还是多个进程的多次写入?
  • 也许fs.appendFile() 只是将数据附加到文件中。
  • fs.appendFile 不会像我做排序插入一样工作。这是一个单一的过程。实际上是一个快速应用程序,其中文件读取/写入位于其自己的模块中。这个想法是用户进行的修改被注销到单独的文件中,然后用户将批准修改,此时修改被插入到原始文件中。当多个批准连续发生时发生截断。
  • “什么是规范的方式或流行的模块来排队异步......”使用async queue。 :)
  • 2022 和问题仍然存在 :) 我很高兴终于找到了能确认我的附加文件的人。在我的例子中,Nuxt 静态站点生成器脚本有时会将不同的状态写入同一个 state.js 文件,从而导致附加的损坏状态文件破坏页面上的整个 JS。知道了问题的根源,我要去准备一些 PR ......你最终使用了建议的 async.queue 方法吗?

标签: node.js asynchronous


【解决方案1】:

使用 async 模块中的 async.queue 创建一个并发为 1 的任务运行器(一次只能运行一个操作)。当发生新的编辑时,将其添加到队列中。你的逻辑如下:

  1. 将任务添加到队列中。
  2. 任务运行时读取现有文件。
  3. 执行您的写入逻辑。
  4. 调用异步队列回调,以便可以进行下一次排队写入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-17
    • 2011-04-05
    • 2020-11-28
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    相关资源
    最近更新 更多