将同步函数放在异步函数中是否仍然会阻塞 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
之后的内容,并且仍然会阻塞,直到该同步代码执行完毕。
例如,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
之后的内容,并且仍然会阻塞,直到该同步代码执行完毕。