Node.js 在NodeJS中,如果一个新请求到达并且事件循环已经在忙于处理一个请求,会发生什么?

Node.js 在NodeJS中,如果一个新请求到达并且事件循环已经在忙于处理一个请求,会发生什么?,node.js,express,Node.js,Express,我把这个文件命名为index.js: const express = require('express') const app = express() const port = 3000 app.get('/home', (req, res) => { res.send('Hello World!') }) app.get('/route1', (req, res) => { var num = 0; for(var i=0; i<1000000;

我把这个文件命名为
index.js

const express = require('express')
const app = express()
const port = 3000

app.get('/home', (req, res) => {
    res.send('Hello World!')
})

app.get('/route1', (req, res) => {
    var num = 0;
    for(var i=0; i<1000000; i++) {
        num = num+1;
        console.log(num);
    }
    res.send('This is Route1 '+ num)
})

app.listen(port, () => console.log(`Example app listening on port ${port}!`))
const express=require('express'))
const app=express()
常数端口=3000
app.get('/home',(请求,res)=>{
res.send('Hello World!')
})
app.get('/route1',(req,res)=>{
var num=0;
for(var i=0;i console.log(`Example app listing on port${port}!`))

我首先调用端点
/route1
,然后立即调用端点
/home
/route1
具有
for loop
,需要一些时间才能完成,然后
/home
运行并完成。我的问题是,当应用程序忙于处理
/route1
时,对
/home
的请求是如何处理的,给定的node js是单线程的?

传入的请求将在nodejs事件队列中排队,直到nodejs有机会处理下一个事件(当长时间运行的事件处理程序完成时)

由于nodejs是一个事件驱动的系统,它从事件队列中获取一个事件,运行该事件的回调直到完成,然后获取下一个事件,运行它直到完成,依此类推。nodejs的内部将等待运行的内容添加到事件队列中,以便为事件循环的下一个周期做好排队准备

根据nodejs如何联网的内部结构,传入的请求可能会在操作系统中排队一段时间,然后移动到事件队列,直到nodejs有机会为该事件提供服务

我的问题是,当应用程序忙于处理/route1时,如果节点js是单线程的,那么对/home的请求是如何处理的


请记住,node.js以单线程的方式运行Javascript(不过如果您愿意,我们现在有),但它确实在内部使用线程来管理文件I/O和其他类型的异步操作。不过,它不需要线程进行联网。这是通过操作系统的实际异步接口来管理的。

Nodejs具有事件循环,事件循环允许Nodejs执行非阻塞I/O操作。每个事件循环定量称为滴答声。事件循环有不同的阶段

首先是
计时器阶段
,因为脚本中没有计时器,所以事件循环将进一步检查I/O脚本

  • 当您点击route
    /route1
    时,Node JS Web Server在内部维护一个有限的线程池,以向客户端请求提供服务。它将被置于FIFO队列中,然后事件循环将进一步进入
    轮询阶段

  • 轮询阶段将等待挂起的I/O,即路由
    /route1
    。偶数循环检查是否将任何客户端请求置于事件队列中。如果否,则无限期等待传入请求

  • 同时,下一个I/O脚本到达FIFO队列,即路由
    /home

  • 先进先出意味着先进先出。因此,先进先出的
    /route1
    将获得执行路由
    /home

    下面你可以通过图表看到这一点

    Node.js应用程序在单线程上运行,事件循环也在同一线程上运行

    js在内部使用libuv库,该库负责处理与操作系统相关的任务,如基于异步I/O的操作系统、网络和并发


    节点有一个内部线程池,当发送阻塞(io或memeory或network)请求时,会从该线程池分配线程。如果没有,则会处理请求并将其发送回。如果线程池已满,则请求会在队列中等待。有关更明确的答案,请参阅