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

时间:2014-10-17 18:21:51

标签: node.js javascript-events single-threaded

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

感谢您的帮助。

1 个答案:

答案 0 :(得分: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

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的简单失败点。