使用Node.js,eventlet或任何其他非阻塞服务器,当给定请求花费很长时间时,会阻塞所有其他请求吗?

例如,一个请求进入,需要200毫秒的时间进行计算,这将阻止其他请求,例如nodejs使用一个线程。

这意味着每秒15K的速度将大大下降,因为计算给定请求的响应所花费的实际时间。

但这对我来说似乎是错的,所以我问真正发生了什么,因为我无法想象事情是如何运作的。

最佳答案

是否“阻止”取决于您对“阻止”的定义。通常,阻塞意味着您的CPU本质上处于空闲状态,但是当前线程无法执行任何操作,因为它正在等待I/O等。除非您使用非推荐的同步I/O函数,否则在node.js中这种事情通常不会发生。取而代之的是,函数会快速返回,并且当它们开始执行的I/O任务完成时,您的回调将被调用,然后从那里进行调用。在此期间,可以处理其他请求。

如果您要在 Node 上进行大量计算,那么在完成该操作之前,将无法使用CPU,但是有一个非常不同的原因:CPU实际上很忙。通常,这不是人们说“阻止”时的意思,而是一个很长的计算。

如果不涉及I/O,并且纯粹在进行计算,则200ms是很长的时间。老实说,那可能不是您应该在 Node 中要做的事情。一种更符合 Node 精神的解决方案是,在由node调用的另一个(非JavaScript)程序中进行这种数字运算,并在完成后调用您的回调。假设您有一台多核计算机(或其他程序在另一台计算机上运行),则当其他程序开始运行时, Node 可以继续响应请求。

在某些情况下,集群(如其他人所提到的)可能会有所帮助,但我怀疑您的集群确实是其中之一。群集的确是为您提供的,当您有大量的小请求,而这些请求的总和超过一个CPU的单个内核所能处理的时,而不是您的单个请求各自花费数百毫秒的情况。

关于node.js - 当这些非阻塞I/O服务器的单个请求花费很长时间时,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8158043/

10-16 09:19
查看更多