adi*_*ggo 4 javascript-events single-threaded node.js
我是nodejs的新手,目前正在学习它.我知道nodejs是单线程的,但是我想知道:如果我使用非阻塞方法,例如,有20000个并发请求,并且有一个请求需要花费很长时间,其他线程需要更短的时间.所以一旦我们遇到了更长的时间请求,nodejs会说"嗨,请暂停,其他请求需要使用",nodejs是否有一个默认时间来检测是否需要暂停?纠正我,如果我使用错误的单词"puase"(因为我认为因为它是单线程,所以它应该停止计算一个请求,如果另一个请求想要处理.).在我假设的情况下,那么较长的请求需要大量时间才能处理?
谢谢你的帮助.
确实,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停止的简单失败点.
| 归档时间: |
|
| 查看次数: |
1308 次 |
| 最近记录: |