Javascript node.js实际如何处理事件循环?
我测试代码Javascript node.js实际如何处理事件循环?,javascript,node.js,Javascript,Node.js,我测试代码 ///create the web server http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); }); /// function compute() { var x = 1111111112; while (x > 0) x--;//about 6 second
///create the web server
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
///
function compute() {
var x = 1111111112;
while (x > 0) x--;//about 6 seconds
setImmediate(compute);//then do it again
}
compute();
假设我们有一个任务compute(),它几乎需要连续运行,并执行一些CPU密集型计算。如果我们还想处理其他事件,比如在同一个节点进程中服务HTTP请求,我发现不可能使用process.nextTick()调整JS线程上的CPU时间,因为process.nextTick的oberver in event循环是空闲的。
观察员优先级如下所示:
///create the web server
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
///
function compute() {
var x = 11111112;//I decrease this number for reducing the running time of compute();
while (x > 0) x--;//about 50 ms
setImmediate(compute);//then do it again
}
compute();
然后一切都很快就开始了
我担心的是:在整个操作中,请求应该在6秒后处理,为什么会持续很长时间?
我一直认为跑步模式如下:
我错了吗?任何帮助都将不胜感激。这是node.js的基本概念。Node.js是基于事件的。这为什么如此重要?因为它解释了节点如何是异步的并且具有非阻塞I/O
每当任务启动时,它都会进入事件循环队列,然后node.js解释器将请求发送到事件循环,事件循环检查任务是I/O阻塞还是非I/O阻塞。如果其I/O阻塞请求,则事件循环将其发送到由node.js库(libuv)管理的线程池。线程池管理一系列任务,如网络、数据库操作、文件系统等。事件循环始终在主线程上运行,因为node.js是单个线程。所有I/O操作都在线程池上运行。当任务在线程轮询中完成时,它调用回调并再次将其传递到队列主线程从队列中提取请求并同时处理它。好的,我想我找到了可能的原因。在请求操作部分中,还有许多类似process.nextTick、setImmediate的函数,它们将持续到下一个tick。因此compute()再次运行againIt是一种糟糕的做法-不要再这样做。如果您需要推迟某些事情,请使用
setTimeout