nodejs单线程?如果有很多并发请求,它是如何工作的

adi*_*ggo 4 javascript-events single-threaded node.js

我是nodejs的新手,目前正在学习它.我知道nodejs是单线程的,但是我想知道:如果我使用非阻塞方法,例如,有20000个并发请求,并且有一个请求需要花费很长时间,其他线程需要更短的时间.所以一旦我们遇到了更长的时间请求,nodejs会说"嗨,请暂停,其他请求需要使用",nodejs是否有一个默认时间来检测是否需要暂停?纠正我,如果我使用错误的单词"puase"(因为我认为因为它是单线程,所以它应该停止计算一个请求,如果另一个请求想要处理.).在我假设的情况下,那么较长的请求需要大量时间才能处理?

谢谢你的帮助.

use*_*654 7

确实,node.js一次只能接收或响应单个请求,但是,它可以同时处理多个请求.

例如,假设您有一个node.js应用程序,它是一个rest api,每个请求都会导致对数据库的调用,但端点C除外.其余的api有3个端点.

端点A:与数据库通信需要3秒钟

端点B:与数据库通信需要2秒钟

端点C:不与数据库通信,它只返回静态文本.

同时发生超过1个请求是不可能的.无论时间戳有多接近,一个都是第一个.

现在,假设我们有10个请求同时发生,按此顺序:

ABCBCCAABC

以下是他们将如何收到并回复:

REC:A
REC:B
REC:C
RESP:C
REC:B
REC:C
RESP:C
REC:C
RESP:C
REC:A
REC:A
REC:B
REC:C
RESP:C
// 2 seconds later
RESP:B
RESP:B
RESP:B
// 1 second later
RESP:A
RESP:A
RESP:A
Run Code Online (Sandbox Code Playgroud)

C总是立即发生,因为它不执行任何异步操作.然后你接收所有B,然后全部A,因为B比A快.

基于数据库设置,B和A的顺序可能不同,例如,如果它被设置为一次只处理x个查询.

如果我们引入并执行需要6秒的同步操作的端点D,您将得到以下结果:

ADABC

REQ:A
REQ:D
// 6 long seconds later...
RESP:D
REQ:A
REQ:B
REQ:C
RESP:C
// 2 seconds later...
RESP:B
// 1 second later...
RESP:A
RESP:A
Run Code Online (Sandbox Code Playgroud)

因为D会在同步操作发生时停止所有javascript处理.执行同步操作的1个端点是某人将api停止的简单失败点.