将同步函数放入异步函数是否仍会阻塞nodejs?

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

例如,require是同步的。

如果我在异步函数中放入require并调用该异步函数,它将阻止nodejs吗?

node.js asynchronous promise async-await require
2个回答
0
投票

如果我在异步函数中放入require并调用该异步函数,它将阻止nodejs吗?

是,是的。如果尚未缓存正在使用require()加载的模块,则它将阻止解释器使用同步文件I / O从磁盘加载该模块。它在async函数中的事实在这方面没有任何影响。

async函数不会以任何方式更改阻塞,同步操作。它们提供自动异常处理,并允许使用await并始终返回承诺。它们没有影响该函数内同步操作的魔力。

FYI,在几乎所有情况下,都应在模块初始化时加载代码中需要的模块。然后可以从其他代码中稍后引用它们,而不会阻止解释器加载它们。


0
投票

它仍然会阻塞。对于要包装在async函数中的任何阻塞代码,都是如此。还要意识到,除非您还使用了async,否则使用await函数是没有用的。

例如,您可以如下编写async函数:

async function work() {
    await null;
    synchronous_task();
}

work();
console.log("called work");

这里,由于work,对await的调用将立即返回,但是一旦该调用之后的代码完成(直到调用堆栈为空),将继续执行[C0之后的内容],并且仍会阻塞,直到该同步代码完成执行为止。

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