将同步函数放在异步函数中是否仍然会阻塞 nodejs?

Does putting synchronous functions in an async function still block nodejs?

例如,require是同步的。

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

If I put require in an async function and call that async function, does it block nodejs?

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

async 函数不会以任何方式改变阻塞、同步操作。它们提供自动异常处理并允许使用 await 并且总是 return 承诺。它们没有影响函数内同步操作的魔力。

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

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

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

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

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

此处对 work 的调用将立即 return,因为 await,但一旦该调用后面的代码完成(直到调用堆栈为空) ,执行将继续执行 await null 之后的内容,并且仍然会阻塞,直到该同步代码执行完毕。