【发布时间】:2019-10-15 05:19:08
【问题描述】:
我有一个 NodeJS 服务器来管理一些文件。它将监视来自外部进程的已知文件名,一旦收到,就读取它,然后将其删除。但是,有时在文件从以前的使用中“解锁”之前尝试读取/删除它,因此可能偶尔会失败。我想做的是尽快重试这个文件,或者在完成后立即重试,或者继续快速重试。
我宁愿尽可能避免长时间睡眠,因为这需要尽快处理,并且每一秒都很重要。
fs.watchFile(intput_json_file, {interval: 10}, function(current_stats, previous_stats) {
var json_data = "";
try {
var file_cont = fs.readFileSync(input_json_file); // < TODO: async this
json_data = JSON.parse(file_cont.toString());
fs.unlink(input_json_file);
} catch (error) {
console.log("The JSON in the could not be parsed. File will continue to be watched.");
console.log(error);
return;
}
// Else, this has loaded properly.
fs.unwatchFile(input_json_file);
// ... do other things with the file's data.
}
// set a timeout for the file watching, just in case
setTimeout(fs.unwatchFile, CLEANUP_TIMEOUT, input_json_file);
我希望“EBUSY:资源繁忙或锁定”偶尔会出现,但文件解锁时并不总是调用fs.watchFile。
我想创建一个函数,然后以 1-10 毫秒的延迟调用它,如果失败也可以调用它自己,但这感觉像是一条通往... 咳嗽 堆栈溢出。
我还想避开同步方法,以便很好地扩展,但是对于 NodeJS 来说相对较新,所有回调都开始变成迷宫。
【问题讨论】:
-
你能改变创建文件的外部服务吗?
-
@HereticMonkey 我不想这样做,因为这会有点尴尬,但是可以。
-
@HereticMonkey SetInterval 如果快速完成并且只有在第一次读取抛出时才会非常有用。但是,这对服务器来说会有点忙吗?这段时间 Node 可能还有其他事情要做。
-
只要你保持你在间隔内做的事情的数量很小,我怀疑这会对服务器造成很大的负担,但你当然应该测试以确保这一点。
setInterval允许在间隔之间运行其他代码。
标签: javascript node.js asynchronous fs