4

我是nodejs的新手,目前正在学习它。我知道nodejs是单线程的,但是我想知道:如果我使用非阻塞方法,例如有20000个并发请求,并且有一个请求需要很长时间,其他线程需要更短的时间。

所以一旦遇到时间较长的请求,nodejs会说“hi,请暂停,其他请求需要使用”,nodejs有没有默认时间检测这个是否需要暂停?如果我使用了错误的词“puase”,请纠正我(因为我认为因为它是单线程的,所以如果要处理另一个请求,它应该停止计算一个请求)。

在我假设的情况下,更长的请求需要很多时间才能处理?

4

1 回答 1

8

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

例如,假设您有一个 node.js 应用程序,它是一个 rest api,每个请求都会导致对数据库的调用,除了端点 C。rest 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

C 总是立即发生,因为它不执行任何异步操作。然后你会收到所有的 B,然后是所有的 A,因为 B 比 A 快。

B 和 A 的顺序可能会因数据库设置而异,例如,如果它设置为一次仅处理 x 个查询。

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

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

因为 D 在发生同步操作时会停止所有 javascript 处理。执行同步操作的 1 个端点很容易导致某人停止您的 api。

于 2014-10-17T18:39:37.393 回答