为什么NodeJS http服务器不会在无限循环中超时?

问题描述 投票:0回答:1

我将NodeJS http服务器超时设置为10秒:

const httpServer = require('http').createServer(app);
httpServer.timeout = 10 * 1000;

到服务器的传入请求在20秒超时时按预期在10秒后超时:

await new Promise(resolve => setTimeout(resolve, 20000));

[当后端请求花费20秒(例如,到:

http://httpstat.us/200?sleep=20000

但是在运行无限循环时它不会超时:

while(true) {}

为什么?

javascript node.js httpserver
1个回答
1
投票

[当您运行无限循环时,Javascript中没有其他事件可以运行。事件循环被阻止。因此,即使控制超时的计时器也无法运行。这是因为Javascript在单个线程中运行JS,而setTimeout()之类的事件是事件驱动的,而不是抢先式的。因此,如果您处于无限循环中,则事件循环将无法处理任何事件,并且setTimeout()永远不会触发,这通常会导致http超时。

欢迎使用node.js的事件驱动的体系结构。

而且,以防万一,您想知道的是:

while(true) {}

也会停止node.js中的所有其他活动,而不仅仅是计时器。唯一可以运行的是工作线程,但在事件循环被阻止的情况下,它们甚至无法与主线程通信。

仅供参考,您可以使用以下示例自己演示:

let now = Date.now();

// set timer for 500ms
setTimeout(() => {
   console.log("timer fired");
}, 500);

// spin for 3 seconds
while (Date.now() - now < 3000) {}

console.log("finished while loop");

您可以非常清楚地看到,在while循环结束之前,计时器不会触发。虽然应该在500毫秒内触发计时器,但直到3秒的while循环完成后,它才可以处理其回调。

© www.soinside.com 2019 - 2024. All rights reserved.