【问题标题】:atomic write/read of a file in nodejsnodejs中文件的原子写入/读取
【发布时间】:2016-07-24 01:09:40
【问题描述】:

我的 nodejs 应用程序是围绕“项目文件”构建的。

这个应用程序的几个模块(“模块”,我的意思是我的项目的一个简单的 javascript 文件)需要经常通过流(fs.createReadStream、fs.createWriteStream)加载、修改和保存这个文件,因为那些模块彼此独立执行,有时来自 websocket 事件(例如),我需要对项目文件进行保存/加载操作 atomic

表示如下场景:

  1. moduleA 写入项目文件
  2. 同时,在moduleA完成写入文件之前,moduleB想要读取它=>理想情况下,它应该等待moduleA的写入操作(目前,它读取部分写入的文件并检测到错误)在真正阅读文件之前

nodejs 是否能够原生地做到这一点,还是我必须在我的读/写流系统上构建一种原子包装器?

【问题讨论】:

    标签: node.js save load atomic


    【解决方案1】:

    据我所知,没有任何内置功能。不过,有些模块(例如 redis-lock)实现了锁定机制。 如果您在单个非集群服务器上运行,您可能可以应付实现一个简单的本地锁。

    【讨论】:

      【解决方案2】:

      这可能会给你一个想法:

      var Fs = require("fs"),
          LOCK = require ("os").tmpdir () + '/foo-lock.';
      
      function transLock(id, cb) {
        Fs.open(LOCK + id, "wx", function(err, fd) {
          if (err) {
            // someone else has created the file
            // or something went wrong
            cb(err);
          } else {
            Fs.close(fd, function(err) {
              // there should be no error here except weird stuff
              // like EINTR which must be ignored on Linux
              cb();
            });
          }
        });
      }
      
      
      function transUnlock(id) {
        Fs.unlink(LOCK + id, function(err) {
          if (err) {
            // something is wrong and nothing we can do except
            // perhaps log something or do some background cleanup
          }
        });
      }
      
      function main() {
        var id = "some-unique-name";
      
        transLock(id, function(err) {
          if (err)
            console.log(err);
          else {
            // ... do your stuffs ...
            transUnlock(id);
          }
        });
      }
      
      main();
      

      【讨论】:

      • 这里的要点是您始终以原子方式授予的写入权限(即使意图只是读取)打开。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多