Express多并发请求疑问:同路由能否同时响应多用户请求?
关于Express路由并发请求的问题解答
好问题!其实这里的核心是要理解Node.js和Express的非阻塞异步模型,我来给你拆解清楚:
核心逻辑:Node.js的异步I/O不会阻塞主线程
Node.js的主线程负责处理事件循环,但像数据库查询这类I/O操作,会被交给底层的线程池去执行,主线程不会一直等待操作完成,而是会立刻释放去处理下一个任务(比如新的用户请求)。
你的代码不会阻塞并发请求
看你写的这段代码:
router.get('/', (req, res, next) => { pool.query("select * from users").then((data) => { setTimeout(() => { res.json(data.rows); }, 5000); }).catch((err) => { res.json({ error: err }); }); });
当第一个请求进来时,主线程执行到pool.query后,就会把数据库查询的任务交给线程池,然后立刻回到事件循环中。这时候如果有第二个用户请求这个路由,Express会马上处理第二个请求的回调函数,同样发起数据库查询——这两个查询是并行执行的,互不干扰。
哪怕数据库查询耗时超出预期(比如卡了十几秒),或者setTimeout延迟5秒返回响应,这些都不会阻塞主线程:
pool.query的回调是在数据库查询完成后,被放入事件循环队列等待主线程处理;setTimeout的回调也是在指定时间后进入队列,主线程只会在空闲时执行这些回调。
只有同步耗时操作才会阻塞
只有当你的代码里出现同步的长时间操作(比如while(true)死循环、同步读取超大文件)时,主线程才会被占用,导致新的请求无法被处理。但你的代码里全是异步操作,完全不存在这个问题。
结论:其他用户完全可以同时请求该路由,每个请求的处理都是独立的,不会互相阻塞。
内容的提问来源于stack exchange,提问作者Diego Barreto
相关产品推荐
相关产品推荐

