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

时间:2019-03-06 09:31:23

标签: javascript node.js

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

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

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

有人可以解释吗?

1 个答案:

答案 0 :(得分: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名工人仍未完成任务并且第五项任务即将到来,则必须等到其中一名工人完成。因此,如果4名工人永远花钱去干他们的工作,那么第5份工作将永远做不完。您可以增加工人数量,但也有不利之处。每个人可能需要更长的时间才能完成任务。

因此,对于Node,它不应与CPU密集型任务一起使用,而应与API网关,处理I / O任务等一起使用...一切都有各自的用途,取决于情况,我们可以解决方案。对于您的上传文件,我们可能会对文件上传或您的仅用于验证数据的应用节点(握手)供其他应用上传文件时有所限制。

对于成千上万的拥有自己的IT部门的公司,我认为他们已经知道在其案例中使用Node的优缺点。