让我说我正在编写并在节点js中读取相同的文件。如何处理数据完整性?我们在节点js中有锁或互斥吗?还是内部处理?
fs.writeFile("test1", "Hey there! Really large data", function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
fs.readFile('test1', 'utf8', function (err,data) {
if (err) {
return console.log(err);
}
console.log(data);
});
答案 0 :(得分:0)
node.js中没有互斥锁或锁,因为它是单线程的。我通常读取文件然后写它的方式是这样的:
function copyFile(source, target){
var done = function(err){
console.log(err);
};
var rd = fs.createReadStream(source);
rd.on("error", function(err){
done(err);
});
var wr = fs.createWriteStream(target);
wr.on("error", function(err){
done(err);
};
rd.pipe(wr);
}
答案 1 :(得分:0)
节点文件系统文档将操作描述为:
文件I / O由标准POSIX函数的简单包装提供
node file code中没有锁/互斥锁,因此操作系统或程序员有责任处理读/写的一致性。 实际上,由于节点是单线程的,所以锁或互斥锁的使用确实没有帮助,因此无法同时调用这些调用。
总是有一个选项,虽然不推荐,但是使用同步版本的调用来保证读/写顺序。
答案 2 :(得分:0)
文件锁定仍然是节点的问题(从版本11开始)
假设您正在写计数器:
----------------------------------
2018-10-31 18:34:05.0000000 +00:00
在读取计数器文件之前,您需要在其上放置一个锁(或等待它),以确保不会覆盖另一个异步请求。
npm上的文件锁定模块令人惊讶,每周有数百万的下载量无法处理真正的并发或根本无法工作。
有关描述,请参见Alex Mills博客:https://medium.com/@the1mills/a-better-mutex-for-node-js-4b4897fd9f11
他还提供了一个软件包来补救:https://github.com/ORESoftware/live-mutex 不幸的是,它利用TCP套接字进行操作,从而带来了所有复杂性。
我仍在寻找使用fcntl咨询文件锁定或另一种保证原子锁定的机制的工作包。 (符号链接)