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