以下是代码:
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:
在我提出这个问题后的一天,我意识到这是一个多么愚蠢的问题。这不是我真正想做的事情。所以我会进一步解释。
这是测试结构:
我有一个处理连接的节点服务器.Client将在'connect'事件上发送'setup'事件。 Redis订阅频道将在服务器端进行,然后从db进行一些查询,然后调用客户端的'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次。但是后来我把请求的数量增加了2000次(没有hrtime()代码),它再也无法完成了。
我完全糊涂了。昨天我认为它与hrtime相关,但当然不是,任何无限循环都会挂起。我被时间误导了。
但现在的问题是什么?
=============================================== ==================== 更新2016.4.19
我解决了这个问题。
原因是我的客户端代码使用socket.disconnect和socket.connect来模拟新用户。这是错的。
在这种情况下,服务器可能无法识别断开的旧套接字。你必须删除你的套接字对象和新的套接字对象。
因此,您可能会发现连接计数不等于断开连接计数,这将阻止我们的代码断开连接到redis,因此整个循环因为redis没有响应而挂起。
答案 0 :(得分:0)
您的代码是无限循环 - 在某些时候,这将总是耗尽系统资源并导致应用程序挂起。
除了导致您的应用程序挂起之外,您发布的代码几乎没有其他功能。基本上,它可以这样描述:
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
如果这真的是你想要做的 - 你已经实现了它,但它总会在某个时刻挂起。否则,您可能希望进一步解释您想要的结果。