【问题标题】:Does putting synchronous functions in an async function still block nodejs?将同步函数放在异步函数中是否仍会阻塞 nodejs?
【发布时间】:2020-03-26 11:36:23
【问题描述】:

例如,require 是同步的。

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

【问题讨论】:

  • 异步是合作多任务处理;如果你不能等待它(或传递一个回调),它就会阻塞。

标签: node.js asynchronous promise async-await require


【解决方案1】:

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

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

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

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

【讨论】:

  • import() 呢?这也会阻止 io 和解释器吗?
  • @DarrenRahnemoon - 是的,import 也是同步的并且会阻塞。 node.js 中的importrequire() 主要是为启动代码而设计的,如果它是异步的,它会非常非常非常复杂。
  • 我一直在寻找这个解释。谢谢你的澄清。我在一个异步函数中有一个 rmSync 调用,我怀疑它阻塞了 nodejs 线程,据你说它确实如此:)
【解决方案2】:

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

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

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

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

这里对work 的调用将立即返回,因为await,但是一旦该调用之后的代码完成(直到调用堆栈为空),将继续执行@ 之后的代码987654328@,并且在同步代码完成执行之前仍然会阻塞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2022-09-29
    • 2013-05-07
    • 2015-04-02
    • 2018-04-06
    相关资源
    最近更新 更多