Node.js的内部-首先执行请求,然后执行其他所有请求

Node.js的内部-首先执行请求,然后执行其他所有请求,node.js,event-loop,Node.js,Event Loop,我创建了一个简单的项目来理解Node.js(事件循环、libuv、线程)的内部结构,结果遇到了一个我不理解的意外行为 这是代码。基本上,服务器侦听请求并执行需要一些时间的计算。(约750ms) process.env.UV_THREADPOOL_SIZE=1; const express=require('express'); const crypto=require('crypto'); const cluster=require('cluster'); const serverStartTi

我创建了一个简单的项目来理解Node.js(事件循环、libuv、线程)的内部结构,结果遇到了一个我不理解的意外行为

这是代码。基本上,服务器侦听请求并执行需要一些时间的计算。(约750ms)

process.env.UV_THREADPOOL_SIZE=1;
const express=require('express');
const crypto=require('crypto');
const cluster=require('cluster');
const serverStartTime=Date.now();
const consoleColors=[“\x1b[31m]”、“\x1b[31m]”、“\x1b[32m]”、“\x1b[33m]”、“\x1b[34m]”;
if(cluster.isMaster){
cluster.fork();
}否则{
常量app=express();
const color=consoleColors[cluster.worker.id];
让requestCount=0;
让firstRequestTime=null;
应用程序获取(“/”,(请求,请求)=>{
const requestStartTime=Date.now();
if(firstRequestTime==null){
firstRequestTime=requestStartTime;
}
const requestNum=requestCount+1;
log(颜色,`Request${requestNum}][PID${process.PID}][start:${requestStartTime-serverStartTime}`);
requestCount+=1;
crypto.pbkdf2('a','b',100000,512',sha512',()=>{
const requestEndTime=Date.now();
const sinceFirstRequest=requestEndTime-firstRequestTime;
const tookTime=requestEndTime-requestStartTime;
log(颜色,`Request${requestNum}][PID${process.PID}][end:${requestEndTime-serverStartTime}][take:${tookTime}ms][SinceFirstRequest:${SinceFirstRequest}ms]`);
res.send(‘你好’);
});
});
app.listen(3000);
}
运行命令后(同时发出5个请求):
ab-c5-n5localhost:3000/
我得到以下日志:

 [Request 1][PID 41495][Started: 1395]
 [Request 1][PID 41495][Ended: 2072][Took: 677ms][SinceFirstRequest: 677ms]
 [Request 2][PID 41495][Started: 2077]
 [Request 3][PID 41495][Started: 2082]
 [Request 4][PID 41495][Started: 2084]
 [Request 5][PID 41495][Started: 2086]
 [Request 2][PID 41495][Ended: 2797][Took: 720ms][SinceFirstRequest: 1402ms]
 [Request 3][PID 41495][Ended: 3465][Took: 1383ms][SinceFirstRequest: 2070ms]
 [Request 4][PID 41495][Ended: 4132][Took: 2048ms][SinceFirstRequest: 2737ms]
 [Request 5][PID 41495][Ended: 4801][Took: 2715ms][SinceFirstRequest: 3406ms]
有人能解释为什么第二个请求总是等待第一个请求完成,而所有后续请求几乎同时开始吗?无论我同时发出多少个请求,第一个请求总是结束,然后所有其他请求都开始

我读到网络使用来自操作系统的资源,一些阻塞操作(如
pbkdf2
)使用线程池。我期望的行为是:记录所有请求的开始,然后逐个记录每个请求的结束

我的第一个猜测是:事件循环的阶段以及它们的执行顺序

因此,我又添加了一个
cluster.fork()
,(现在有两个事件循环)。如果此行为是由于阶段造成的,则应执行每个事件循环的第一个请求。但事实并非如此。最初只执行第一个
cluster.fork()
的一个请求,然后其他所有事情都会发生

我不知道我的思路是否正确,请帮助我理解