服务器如何确保客户端请求不会相互干扰?
How the server make sure clients requests doesn't interfere with each other?
我有一个面试问题,服务器如何做到不让客户端请求相互拦截?
我实际上无法回答这个问题,因为我没有在网上找到答案。
我想是parrel的原因requests/asynccalls/concurrency还是threading.
但我对此没有真正的答案。
不确定我是否理解你的问题,但这篇文章很好地解释了 nodeJS 的单线程模型 imo (node-js-architecture-single-threaded-event-loop)
tldr:
NodeJS 的事件循环只有一个线程。我不确定具体的数据结构实现,但每个请求都被添加到一个队列中,事件循环在该队列中获取、执行并发送响应。
如果请求执行阻塞 IO(或其他阻塞进程*),操作将移交给不同的线程,请求被放入某个等待列表,事件循环选择不同的请求来处理。阻塞操作完成后,事件循环获取原始请求并加上操作的结果,继续处理请求然后发送响应。
* 如果阻塞过程是由您按程序编码的,您最终可能会阻塞导致 DOS 的事件循环。为此应该使用工作线程。
** NodeJS 也有使用 cluster 模块的多线程概念,但它仍然通常被认为是单线程的。
我有一个面试问题,服务器如何做到不让客户端请求相互拦截?
我实际上无法回答这个问题,因为我没有在网上找到答案。
我想是parrel的原因requests/asynccalls/concurrency还是threading.
但我对此没有真正的答案。
不确定我是否理解你的问题,但这篇文章很好地解释了 nodeJS 的单线程模型 imo (node-js-architecture-single-threaded-event-loop)
tldr:
NodeJS 的事件循环只有一个线程。我不确定具体的数据结构实现,但每个请求都被添加到一个队列中,事件循环在该队列中获取、执行并发送响应。
如果请求执行阻塞 IO(或其他阻塞进程*),操作将移交给不同的线程,请求被放入某个等待列表,事件循环选择不同的请求来处理。阻塞操作完成后,事件循环获取原始请求并加上操作的结果,继续处理请求然后发送响应。
* 如果阻塞过程是由您按程序编码的,您最终可能会阻塞导致 DOS 的事件循环。为此应该使用工作线程。
** NodeJS 也有使用 cluster 模块的多线程概念,但它仍然通常被认为是单线程的。