Moo*_*lio 7 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.js 和 简单nodejs http代理失败,"太多打开的文件" 作为参考,但我'我不知道如何将npm 的graceful方法应用于createConnection调用.
非常感谢!
即使您可以捕获此异常,您会对此做些什么有用的事情吗?如果某处有泄漏,则需要修复泄漏,如果负载正常但非常高,则需要以某种方式处理此问题。不管怎样,当你遇到这种情况时,你的节点进程就会变得非常糟糕。
不幸的是,当您处理 uncaughtException 事件时,唯一安全的做法是记录错误消息,然后退出进程。引发异常的堆栈现在已经消失,并且可能很快就会导致严重的内部混乱。
最好的解决方案是增加进程可用的文件描述符的数量。好消息是文件描述符确实很便宜。
| 归档时间: | 
 | 
| 查看次数: | 5327 次 | 
| 最近记录: |