单个请求花费很长时间处理这些非阻塞的io服务器时会发生什么情况?

使用nodejs或eventlet或任何其他非阻塞服务器,当给定的请求花费很长时间会发生什么,然后阻塞所有其他请求?

例如,请求进来,需要200ms计算,这将阻止其他请求,因为例如nodejs使用单个线程。

意思是每秒钟15K的时间将大大减less计算响应给定请求所花费的实际时间的b / c。

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

是否“阻塞”取决于您对“阻塞”的定义。 通常情况下,块意味着你的CPU本质上是空闲的,但是当前的线程不能对它做任何事情,因为它正在等待I / O之类的。 除非使用非推荐的同步I / O函数,否则这种事情不会发生在node.js中。 相反,函数会很快返回,当I / O任务开始完成时,您的callback会被调用,并从此处取回。 在此期间,其他请求可以被处理。

如果你正在做一些计算量大的节点,那么在完成之前,没有别的东西能够使用CPU,但是出于一个非常不同的原因:CPU实际上很忙。 通常这不是人们说“阻塞”时的意思,而只是一个长时间的计算。

如果不涉及I / O并且纯粹进行计算,200ms是需要很长时间的。 说实话,这可能不是你应该在节点上做的事情。 一个解决scheme更多的解决scheme将是在另一个(非JavaScript)的程序被称为节点,并在完成时调用您的callback的那种数字计算。 假设你有一个多核心机器(或另一个程序运行在不同的机器上),节点可以继续响应请求,而另一个程序嘎吱嘎吱。

有些情况下(如其他人提到的)可能会有帮助,但是我怀疑你的确是其中之一。 当你有很多很多很less的请求时,真正的集群是可以处理的,而不是一个CPU的单个核心可以处理的,而不是单个请求需要几百毫秒的情况。

你完全正确。 如果长时间运行的代码不是asynchronous的,那么Nodejs开发人员必须意识到这一点,否则他们的应用程序将是完全非高性能的。

所有需要花费很长时间的事情都需要asynchronous完成。

node.js中的所有内容都在内部并行运行。 但是,您自己的代码严格地串行运行。 如果在node.js中睡一会儿,服务器会hibernate一秒钟。 它不适合需要大量计算的请求。 I / O是并行的,你的代码通过callback来实现I / O(所以你的代码在等待I / O的时候没有运行)。

在大多数现代平台上,node.js 是否为I / O提供线程。 它使用libev ,它在平台上使用最好的线程。

这基本上是正确的,至less如果您不使用新的clusterfunction来平衡多个自动派生的工作人员之间的传入连接。 但是,如果您使用它,大多数其他请求仍然会很快完成。

编辑:工人是stream程。

你可以把事件循环看作10个排队等待付款的人。 如果有人花费太多时间来支付他的账单(从而阻止事件循环),其他人将不得不等待轮到他们来等待……

换句话说 :

由于事件循环在一个线程上运行,所以我们不要通过在callback函数或同步I / O中执行大量计算来阻止它的执行。 查看大量值/对象或在callback函数中执行耗时的计算可防止事件循环进一步处理队列中的其他事件。