是否可以通过在事件队列上放置一个长时间运行的进程来挂起Node.js?

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

我正在向一位采访者展示事件队列的工作情况,突然他问我,如果调用堆栈上有一个长时间运行的进程?这会永远挂起Node.js吗?

据我所知,应该这就是我告诉他的,因为我有一些编写一些糟糕的无限循环的经验,这些循环冻结了我的Chrome和所有。

然后他通过询问是否有一个理想的功能来反击我,这个平台正在被成千上万的公司用于生产系统?说实话,我很难过。

谁能解释一下?

javascript node.js
1个回答
0
投票

对于您的问题:是的,可以通过在事件队列上放置一个长时间运行的进程来挂起节点。

你可以在这里阅读一些信息:https://nodejs.org/en/docs/guides/dont-block-the-event-loop/

默认情况下,Node有1个主线程来运行事件循环,4个工作线程来运行I / O,OS,异步任务。因此,如果您的代码在事件循环中运行时间太长,您的应用程序将看起来像是挂起。

例如:

function doWork(duration) {
    const start = Date.now();
    while (Date.now() - start < duration) {
    }
}

app.get('/', (req, res) => {
    doWork(10000);
    res.send('Hello world');
})

app.get('/hi', (req, res) => {
    res.send('Hi');
});

在这种情况下,如果您的请求到第一个路由器并请求到第二个路由器之后。第二个请求必须等待第一个请求完成才能发送响应。所以它将在10秒内挂起。

对于工人案例,如果所有4名工人仍未完成任务并完成第5项任务,则必须等到其中一名工人完成。因此,如果4名工人永远工作,那么第5项工作将永远不会完成。你可以增加工人数量,但也有不足之处。每个人可能需要更长时间才能完成任务。

所以对于Node来说,它不应该与CPU密集型任务一起工作,而应该适用于像API网关,处理I / O任务等等......一切都有自己使用和依赖的情况,我们可以有解决方案来解决。在您的上传文件的情况下,我们可以对文件上传或您的应用程序节点有一些限制,仅用于验证数据,而不是其他应用程序上传文件的握手。

对于拥有自己的IT部门的数千家公司,我认为他们已经知道在他们的案例中使用Node的优势和劣势。

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