Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js实际如何处理事件循环?_Javascript_Node.js - Fatal编程技术网

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循环是空闲的。 观察员优先级如下所示:

  • idle observer//process.nextTick具有最高优先级
  • I/O观察器//第二个是I/O观察器,包括web请求和其他I/O操作
  • check observer//setImmediate()函数的观察者是check observer
  • 因此,我使用setImmediate将整个计算分为几部分,以便其他观察者(空闲和I/O)可以在Javascript继续运行compute()函数之前像处理请求一样处理其事件

    结果很奇怪: 当一个请求出现时,它会被处理,但不是一次处理。既然我将compute()的计算时间设置为6秒左右,为什么我的浏览器要过这么多秒(大于6秒)才能得到结果 因此,我开始将计算时间减少到大约50毫秒,这比以前小得多

    ///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秒后处理,为什么会持续很长时间? 我一直认为跑步模式如下:

  • 计算6秒
  • 如果事件循环发现I/O观察者(web请求)正在等待,则将请求和响应处理到客户端浏览器

  • 然后事件循环继续像compute()一样工作

  • 再次在上面循环
  • 但是node.js似乎将请求操作分成了许多部分,这会导致处理请求的时间过长吗


    我错了吗?任何帮助都将不胜感激。

    这是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