Express服务器同一API端点能否支持多客户端请求并发执行?
Node.js 同端点并发请求问题解答
- 多个客户端同时调用同一个端点时不需要等待前一个请求处理完成,默认就是并发执行的,不会顺序阻塞。
原理说明
Node.js 的事件循环机制是单线程调度,但所有异步 API(比如你用到的setTimeout、网络IO等)都是非阻塞的。你写的/test3路由回调执行逻辑只有两步:打印日志、注册setTimeout定时器,这两步都是同步操作,总耗时不到1毫秒,执行完成后主线程就会立刻释放出来处理下一个请求,不会等待5秒的定时器触发。
双客户端请求/test3的实际运行流程
- 客户端1请求到达,主线程同步执行
console.log("test3"),然后把5秒后返回响应的回调注册到定时器队列,主线程恢复空闲 - 客户端2请求紧接着到达,主线程立刻处理,再次执行
console.log("test3"),注册第二个5秒定时器,主线程再次空闲 - 5秒时间到后,两个定时器回调几乎同时被触发,分别给两个客户端返回响应,两个请求的总耗时都是5秒左右,不会出现第二个请求耗时10秒的情况。
实测现象解释
你在/test3等待返回的过程中请求/test2能立刻得到响应,就是因为定时器未触发时主线程完全空闲,可以随时处理新请求。/test2的回调没有异步等待逻辑,执行到res.send("test2")就直接返回响应,全程不会被其他请求的异步等待操作阻塞。
补充说明
只有当路由回调里存在大量同步计算逻辑(比如CPU密集型的循环、加密计算等)时,才会阻塞事件循环,导致后续请求需要等待当前同步逻辑执行完成才能被处理。只要你用的是异步非阻塞的API,不管是同端点还是不同端点的请求,都可以并行处理。
内容的提问来源于stack exchange,提问作者natymere
相关产品推荐
相关产品推荐

