防止 node.js 中事件循环阻塞的有效方法

Efficient way to prevent Event Loop Blocking in node.js

提问人:Liu Zhang 提问时间:10/12/2023 更新时间:10/12/2023 访问量:53

问:

我目前正在使用 Express.js 创建两个 API。两者都相对简单。第一个 API 涉及一个贯穿 1 到 3,000,000 的 for 循环。同时,第二个 API 旨在在控制台中打印一个简单的字符串。

我已经准备好并设置了所有源代码。

app.get('/firstAPI', (req, res) => {
    for (let i = 1; i <= 3000000; i++) {
        console.log('First API' + i + '\n');
    }
});

app.get('/secondAPI', (req, res) => {
    console.log('Here is the Second API');
});

但是,我遇到了障碍。如果我调用第一个 API,则需要花费大量时间才能执行。然后,尽管第二个 API 很简单,但这个冗长的过程会阻止对第二个 API 的任何调用。我怀疑这是由于 node.js 中的事件循环阻塞。

所以,我的问题是:我怎样才能规避或防止这种阻塞?

JavaScript 节点 .js 数组 循环 表示

评论

2赞 jfriend00 10/12/2023
呃,不要编写或运行占用 CPU 的代码。Nodejs 在事件驱动的系统中运行 Javascript,并且仅使用单个线程来运行 Javascript。如果 CPU 密集型代码使单个线程陷入困境,则在 CPU 密集型代码完成之前,其他 Javascript 无法运行。或者,如果必须有占用 CPU 的代码,则将该代码移动到 workerThread 或 child_process。这是nodejs服务器的基本原理。它的异步 I/O(网络和磁盘)非常高效,不会占用 CPU。
1赞 jfriend00 10/12/2023
此外,如果您展示真实世界问题的代码,而不是一个除了占用 CPU 并故意填满控制台之外什么都不做的人工循环,您可能会获得更有意义的帮助,这些帮助可以更有意义地探索真正的替代方案或解决方案。for

答:

0赞 Tricotou 10/12/2023 #1

如上所述,请分享您正在做的事情的示例,因为在这里您只是使用 CPU 100%,这基本上永远不会发生。另外,您甚至不响应请求,这意味着它将在客户端永久保留(至少在超时之前)

在您的代码中,只要您不 100% 加载 CPU,API 就已经是非阻塞的。例如:

app.get('/firstAPI', (req, res) => {
    console.log('First API received request');
    setTimeout(function(){
        res.end();
        console.log('First API responded to request');
    }, 5000);
});

app.get('/secondAPI', (req, res) => {
    console.log('Here is the Second API');
    res.end();
});

在这种情况下,第一个 API 需要 5 秒才能回答,但在这 5 秒内,第二个 API 可以正常工作