【问题标题】:What's the correct way to handle removing a potentially busy file in NodeJS?处理删除 NodeJS 中可能很忙的文件的正确方法是什么?
【发布时间】: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


【解决方案1】:

这个故事可能会结束,但您可以创建自己的完全控制的 fs。在这种情况下,其他程序会将数据直接写入您的程序。只需按字词 fusefuse-binding

搜索

【讨论】:

    猜你喜欢
    • 2013-07-24
    • 2011-11-29
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多