gpt4 book ai didi

javascript - 计算多次写入文件何时会导致不准确?

转载 作者:可可西里 更新时间:2023-11-01 09:58:55 26 4
gpt4 key购买 nike

在我的 Node 服务器中我有一个变量,

var clicks = 0;

每次用户在 web 应用程序中单击时,websocket 事件都会发送一条消息。在服务器上,

clicks++;
if (clicks % 10 == 0) {
saveClicks();
}

function saveClicks() {
var placementData = JSON.stringify({'clicks' : clicks});
fs.writeFile( __dirname + '/clicks.json', placementData, function(err) {
});
}

我必须以什么速度开始担心覆盖?我将如何计算这个数学?

(我正在考虑为每次点击创建一个 MongoDB json 对象,但我很好奇 native 解决方案可以提供什么)。

最佳答案

来自 fs.writeFile() 的 node.js 文档:

Note that it is unsafe to use fs.writeFile() multiple times on the same file without waiting for the callback. For this scenario, fs.createWriteStream() is strongly recommended.

这不是要弄清楚什么时候可能会导致问题的数学问题 - 它只是糟糕的代码,让您有可能在无法预测的情况下发生冲突。 node.js 文档明确指出这可能会导致冲突。

为确保您没有冲突,请以不同的方式编写代码,以免发生冲突。

如果您想确保所有写入都按照传入请求的正确顺序进行,以便最后到达的请求始终是最终出现在文件中的请求,那么您需要在数据到达时对其进行排队(因此顺序被保留)并以一种打开文件进行独占访问的方式写入文件,这样当先前的请求仍在写入时,其他请求就无法写入,并适本地处理争用错误。

这是数据库大多自动为您解决的问题,因此这可能是使用数据库的原因之一。

假设您没有使用集群,因此没有多个进程试图写入此文件,并且您只想确保发送的最后一个值是此进程写入文件的值,您可以做一些事情像这样:

var saveClicks = (function() {
var isWriting = false;
var lastData;
return function() {
// always save most recent data here
lastData = JSON.stringify({'clicks' : clicks});
if (!isWriting) {
writeData(lastData);
}

function writeData(data) {
isWriting = true;
lastData = null;
fs.writeFile(__dirname + '/clicks.json', data, function(err) {
isWriting = false;
if (err) {
// decide what to do if an error occurs
}
// if more data arrived while we were writing this, then write it now
if (lastData) {
writeData(lastData);
}
});
}
}
})();

关于javascript - 计算多次写入文件何时会导致不准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35418262/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com