使用 node.js 扫描目录树时,由于我们对大目录使用异步回调,因此很容易立即将超过 1000 个 fs 操作立即排队,这通常会导致 node.js 进程崩溃或仅用于 fs 操作因“EM 打开的文件过多”错误而失败。
有没有人想出一个优雅的方法来解决这个问题?
使用 node.js 扫描目录树时,由于我们对大目录使用异步回调,因此很容易立即将超过 1000 个 fs 操作立即排队,这通常会导致 node.js 进程崩溃或仅用于 fs 操作因“EM 打开的文件过多”错误而失败。
有没有人想出一个优雅的方法来解决这个问题?
历年更新:
——</p>
不确定这是否是解决此问题的最佳方法,但我有效地做的是用一个包装器包装所有异步 fs 函数,该包装器检查我们是否打开了超过允许数量的文件(任意设置为合理的100)。如果在通话时打开的文件多于这么多,通话将处于空闲状态,并在延迟后再次检查以查看现在是否有打开文件。这个逻辑的代码可以在这里找到:https ://github.com/balupton/bal-util/blob/master/src/lib/paths.coffee#L7-45
在实现它方面,您只需要更改require('fs').readFile
或您正在使用的任何调用require('bal-util').readFile
并安装足够简单的bal-util依赖项 ( )。npm install bal-util
希望这可以帮助。如果有更强大的方法可以做到这一点,我很想知道。
我使用过的最简洁的模式涉及使用async
带有队列的模块(https://github.com/caolan/async)。您可以设置队列中的最大并发项目数。
var queue = async.queue(do_thing, 500);
queue.drain = function() {
console.log("Done with entries");
};
queue.push(workitem);