asynchronous - 如何在不修改ulimit的情况下处理nodejs EMFILE异常?

标签 asynchronous node.js

我是 Node.JS 的新手,遇到了 EMFILE 错误。我正在寻找一种捕获 EMFILE 异常并在代码中处理它的方法。

似乎有很多关于“错误:EMFILE,打开的文件太多”错误的问题,但大多数答案似乎都是“增加您的 ulimit”。

我的第一个问题是,如何捕捉这个异常?当我使用许多 连接运行以下代码时,它会引发 EMFILE 错误:

  stream = net.createConnection(port, host);

  stream.addListener('connect', function() {
    return stream.write(request);
  });
  stream.addListener('data', function(data) {
    return console.log(data);
  });
  stream.addListener('end', function() {
    stream.end();
    return callback();
  });
  stream.addListener('timeout', function() {
    stream.destroy();
    console.log("timeout");
    return callback();
  });
  stream.addListener('error', function(e) {
    console.log("this never gets called");
    return
  });

异常没有被“错误”监听器捕获。我尝试将上面的内容包装在 try{} catch (e) {} 中,但没有任何反应。我为 createConnection 使用了回调方法,它没有返回任何错误。

我能够捕获异常的唯一方法是:

process.on('uncaughtException', function(err) {
  console.log(err);
});

这似乎不安全,因为它会捕获所有内容。

所以我的第二个问题是:捕获错误并重试调用的“最佳实践”方法是什么?

我看过: https://github.com/isaacs/npm/blob/master/lib/utils/graceful-fs.jsSimple nodejs http proxy fails with "too many open files" 作为引用,但我不确定如何将 npm 中的 优雅 方法应用到 createConnection 调用。

非常感谢!

最佳答案

即使您可以捕捉到这个异常,您是否会对此做些有用的事情?如果你在某处有泄漏,你需要修复泄漏,如果你有正常但非常高的负载,那么你需要以某种方式处理这个问题。无论哪种方式,当您遇到这种情况时, Node 进程中的情况都非常糟糕。

不幸的是,当您处理 uncaughtException 事件时,唯一安全的做法是记录一条错误消息,然后退出进程。抛出异常的堆栈现在已经不存在了,很可能很快就会产生严重的内部困惑。

最好的解决方案是增加进程可用的文件描述符的数量。好消息是文件描述符真的很便宜。

关于asynchronous - 如何在不修改ulimit的情况下处理nodejs EMFILE异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6486162/

相关文章:

javascript - 使用 koa 2 和 mongoose 进行异步/等待

c# - 为什么要对 QueueBackgroundWorkItem 使用异步?

javascript - 如何在 Jest 中使用 doMock?

node.js - npm - 发布具有多个版本的多个分支模块

node.js - Node - connect-flash 不适用于重定向

node.js - Node js。异步加解密

angular - 如何从 Observable.from 收集发射值数组?

angular - 如何让 forEach 等待订阅完成?

node.js - 在Electron中运行nodegit失败

node.js - 不需要的多个 MongoDB 连接