Nodejs是单线程的,但它如何在1秒内处理同一个并发请求

时间:2017-02-16 23:02:46

标签: node.js

我有场景 假设客户端向节点服务器发送请求,节点js需要1秒来用单线程处理它。 然后我的问题是:

在同一时刻处理相同的1000个请求需要多长时间。

我知道答案只有1秒。但我不知道如何。 应该花费1000秒,因为每个 请求需要1秒进行处理。 。 请告诉我如何通过单线程

在一秒钟内完成所有请求

1 个答案:

答案 0 :(得分:2)

如果每个请求的实际完整CPU使用率为1秒,则1000个请求将需要1000秒才能处理。周围没有神奇的子弹。因此,要处理1000 /秒,您将需要1000个CPU(显然分布在多个群集服务器上)。

但是,如果1秒响应时间实际上只是请求的总时间,并且node.js可能正在等待数据库查找或文件操作(两者都是异步)的大部分时间,那么CPU大部分时间都处于空闲状态,当一个请求正在等待某些I / O操作响应时,它可能正在处理另一个请求。然后,当那个等待I / O时,它可以启动另一个请求。通过这种方式,单个线程可以同时具有许多不同的请求(假设这些请求正在执行一些异步I / O作为其处理的一部分)。通过这种方式,node.js可以交错多个不同的操作,但所有操作都只有一个线程。

这是node.js设计的大规模优势。它不是需要为每个并发请求提供相当重量级的线程,而是实际上可以使用单个线程为多个请求提供服务。而不是使用操作系统级调度和多个堆栈帧来对时间片操作系统级线程进行操作,只要一块JS将控制权返回给系统,node.js就会控制事件队列中的另一个事件,因为它正在等待一个I / O响应事件回来。

  

请告诉我如何通过单线程

在一秒钟内完成所有请求

只有当任何给定请求的实际CPU时间小于1/1000秒时,才能执行此操作。否则,您将不得不涉及多个CPU,以处理1000个请求/秒。您可能还需要多个网卡,因为您正在谈论能够在不到1毫秒内读取请求并发送响应。单个网卡不太可能。