如何在一次打开太多文件时阻止node.js崩溃?

时间:2012-08-19 02:53:32

标签: node.js

当使用node.js扫描目录树时,因为我们利用具有大目录的异步回调,很容易立即排队超过1000 fs的操作,这通常会导致node.js进程崩溃或仅仅因为使用“EM太多打开文件”错误导致fs操作失败。

有没有人想出解决这个问题的优雅方法?

2 个答案:

答案 0 :(得分:1)

多年来的更新:

  1. 我根据此答案编写了一个https://npmjs.com/package/safefs
  2. Isaac编码https://npmjs.com/package/graceful-fs
  3. Safefs现在使用graceful-fs包
  4. 流程存在同样的问题,所以我创建了https://npmjs.com/package/safeps包,解决了许多其他问题
  5. -

    不确定这是否是解决此问题的最佳方法,但我有效完成的是使用包装器包装所有异步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),这很简单够了。

    希望这会有所帮助。如果有更强大的方法,我很想知道。

答案 1 :(得分:0)

我使用的最干净的模式涉及使用async模块(https://github.com/caolan/async)和队列。您可以设置队列中的最大并发项数。

var queue = async.queue(do_thing, 500);
queue.drain = function() {
    console.log("Done with entries");
};

queue.push(workitem);