处理删除 NodeJS 中可能很忙的文件的正确方法是啥?
Posted
技术标签:
【中文标题】处理删除 NodeJS 中可能很忙的文件的正确方法是啥?【英文标题】: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 来说相对较新,所有回调都开始变成迷宫。
【问题讨论】:
你能改变创建文件的外部服务吗? 否则,你可以使用类似Node Js: Test to see if a file is locked for editing by another process的轮询方法 @HereticMonkey 我不想这样做,因为这会有点尴尬,但是可以。 @HereticMonkey SetInterval 如果快速完成并且只有在第一次读取抛出时才会非常有用。但是,这对服务器来说会有点忙吗?这段时间 Node 可能还有其他事情要做。 只要你保持你在间隔内做的事情的数量很小,我怀疑这会对服务器造成很大的负担,但你当然应该测试以确保这一点。setInterval
允许在间隔之间运行其他代码。
【参考方案1】:
这个故事可能会结束,但您可以创建自己的完全控制的 fs。在这种情况下,其他程序会将数据直接写入您的程序。只需按字词 fuse 和 fuse-binding
搜索【讨论】:
以上是关于处理删除 NodeJS 中可能很忙的文件的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章