【发布时间】:2021-08-28 07:35:21
【问题描述】:
我有一个面试问题,服务器是如何做到不让客户端的请求相互拦截的?
我实际上无法回答,因为我没有在网上找到答案。
我想到了parrel请求/异步调用/并发或线程的原因。
但我对此没有真正的答案。
【问题讨论】:
标签: node.js multithreading asynchronous async-await concurrency
我有一个面试问题,服务器是如何做到不让客户端的请求相互拦截的?
我实际上无法回答,因为我没有在网上找到答案。
我想到了parrel请求/异步调用/并发或线程的原因。
但我对此没有真正的答案。
【问题讨论】:
标签: node.js multithreading asynchronous async-await concurrency
不确定我是否理解您的问题,但这篇文章很好地解释了 nodeJS 的单线程模型(node-js-architecture-single-threaded-event-loop)
tldr:
NodeJS 有一个用于事件循环的线程。我不确定具体的数据结构实现,但每个请求都被添加到队列中,由事件循环拾取、执行并发送响应。
如果请求执行阻塞 IO(或其他阻塞进程*),则操作将移交给不同的线程,请求被放入某个等待列表中,并且事件循环会选择不同的请求来处理。一旦阻塞操作完成,事件循环会获取原始请求并加上操作的结果,继续处理请求然后发送响应。
* 如果阻塞进程是由您在程序上编码的,您最终可能会阻塞导致 DOS 的事件循环。应该为此使用工作线程。
** NodeJS 也有使用集群模块的多线程概念,所以有,但它仍然通常被认为是单线程的。
【讨论】: