代码如下:
var process = require('process')
var c = 0;
while (true) {
var t = process.hrtime();
console.log(++c);
}
这是我的环境:
在 Windows 7 中运行的 Oracle VM virtualbox v5.0.4 r102546 上的 nodejs v4.2.4、Ubuntu 14.04 LTS
这个循环在它挂起之前只能运行大约 60k 到 80k 次。之后什么也没有发生。
在我同事的电脑上可能有 4 万到 6 万次。但是这个循环不应该永远持续下去吗?
我首先运行了一个测试建立连接的平均执行时间的基准测试,所以我不能先获取开始时间,然后在一切完成后获取结束时间。
这与我使用的操作系统有关吗?
如果有人知道这个问题,谢谢。
============================================= ===========
2016.4.13 更新:
在我提出这个问题的第二天,我意识到这是一个多么愚蠢的问题。这不是我真正想做的。所以我要进一步解释。
这是测试结构:
我有一个处理连接的 Node 服务器。客户端将在“连接”事件上发送一个“设置”事件。将在服务器端创建一个 Redis 订阅 channel ,然后从数据库进行一些查询,然后调用客户端对“setup”事件的回调。客户端在“setup”回调中断开套接字,并在“disconnect”事件中重新连接。
客户端代码使用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 次。但是后来我把请求次数提高到like 2000次(没有hrtime()代码),又无法完成。
我完全糊涂了。昨天还以为跟hrtime有关,当然不是,随便死循环都会挂。我被 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 - nodejs process.hrtime() 挂掉是什么原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36567312/