代码如下:

var process = require('process')
var c = 0;
while (true) {
    var t = process.hrtime();
    console.log(++c);
}

这是我的环境:
nodejs v4.2.4,运行在Windows 7上的Oracle VM virtualbox v5.0.4 r102546上的Ubuntu 14.04 LTS
这个循环在挂起之前只能运行大约60k到80k次。之后什么也没发生。
在我同事的电脑里可能有4万到6万次但这种循环不应该永远持续下去吗?
我第一次运行一个基准测试,测试建立连接的平均执行时间,所以我不能只得到开始时间,然后是结束时间。
这和我使用的操作系统有关吗?
如果有人知道这个问题,谢谢。
==========================================================
更新2016.4.13:
就在我提出这个问题后的一天,我意识到这是一个多么愚蠢的问题。这不是我真正想做的。所以我要进一步解释。
以下是测试结构:
我有一个处理连接的节点服务器。客户端将在“连接”事件上发送“安装”事件。将在服务器端创建Redis订阅通道,然后从数据库进行一些查询,然后调用客户端的“setup”事件回调。“安装程序”回调中的客户端断开连接套接字,并在“断开连接”事件时重新连接。
客户端代码使用socket.io-client在后端和集群中运行,以模拟高并发性。
代码如下:
(此处未列出某些功能)
[server]
socket.on('setup', function(data, callback) {
  queryFromDB();
  subscribeToRedis();
  callback();
}

[client]
var requests = 1000;
if (cluster.isMaster) {
  for (var i = 0; i < 100; ++i) {
    cluster.fork();
  }
} else {
  var count = 0;
  var startTime = process.hrtime();
  socket = io.connect(...);
  socket.on('connect', function() {
    socket.emit('setup', {arg1:'...', arg2:'...'}, function() {
      var setupEndTime = process.hrtime();
      calculateSetupTime(startTime, setupEndTime);
      socket.disconnect();
    }
  }

  socket.on('disconnect', function() {
    if (count++ < requests) {
      var disconnectEndTime = process.hrtime();
      calculateSetupTime(startTime, disconnectEndTime);
      socket.connect();
    } else {
      process.exit();
    }
  }
}

起初,这种连接只能进行500到600次。不知怎么的,我删除了所有的hrtime()代码,它成功了1000次。但后来我把请求数提高到2000次左右(没有hrtime()代码),它就不能再完成了。
我完全糊涂了。昨天我以为这和时间有关,但当然不是,任何无限循环都会挂起。我被时间误导了。
但现在有什么问题?
===================================================================
更新2016.4.19
我解决了这个问题。
原因是我的客户端代码使用socket.disconnect和socket.connect来模拟新用户。这是错误的。
在这种情况下,服务器可能无法识别断开连接的旧套接字。您必须删除套接字对象并重新创建另一个。
因此,您可能会发现连接计数不等于断开计数,这将阻止代码断开与redis的连接,因此整个循环将由于redis不响应而挂起。

最佳答案

您的代码是一个无限循环—在某些情况下,这会耗尽系统资源并导致应用程序挂起。
除了导致应用程序挂起之外,您发布的代码几乎没有其他作用。基本上,可以这样描述:

For the rest of eternity, or until my app hangs, (whichever happens first):
    Get the current high-resolution real time, and then ignore it without doing anything with it.
    Increment a number and log it
Repeat as quickly as possible

如果这真的是你想做的-你已经做到了,但它将永远挂在某个点上。否则,您可能需要进一步解释您想要的结果。

关于javascript - 是什么原因导致process.hrtime()卡在nodejs中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36567312/

10-14 15:56
查看更多