繁体   English   中英

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

[英]Is it possible to hang Node.js by putting a long running process on event queue?

我向一名采访者演示了事件队列的工作,突然他问我呼叫堆栈上是否有一个长时间运行的流程? 那会永远挂Node.js吗?

据我所知,这就是我告诉他的内容,因为我在编写一些糟糕的无限循环方面有一定的经验,这些无限循环使我的Chrome和所有机器陷入僵局。

然后,他提出了一个平台,该平台是否已被成千上万家公司用于生产系统的平台使用,这是我的反驳。 老实说,我很沮丧。

谁能解释?

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

您可以在此处阅读一些信息: 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的优缺点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM