NodeJS中的异步与同步

Asynchronous Vs synchronous in NodeJS

本文关键字:同步 异步 NodeJS      更新时间:2023-09-26

我是NodeJS的新手。我看到同一任务有单独的异步和同步函数(例如:{fs.writeFile,fs.writeFileSync},{fs.read, fs.readSync})。

有人能解释为什么吗?有什么区别?

异步:

  1. 发送请求
  2. 继续执行其他代码
  3. 回拨时随时收到响应

同步:

  1. 发送请求
  2. 等待响应
  3. 响应后继续使用其他代码

同时拥有这些操作的同步和异步版本的原因是它们可能很耗时。由于node.js有一个单线程的主事件循环,因此在任何情况下都不希望使用慢速同步函数调用来阻塞事件循环。

这就是为什么所有事情都使用回调/承诺/期货来完成的原因。通过这种方式,您可以有一个事件循环,它只调用异步函数,并在回调中处理异步函数的结果。

这是node.js的主要优势之一,也是基本规则之一:;"不阻塞主事件循环";。

在引用node.js fs.writeFile文档时,它异步地将数据写入文件。这意味着如果你有以下代码:

1. some db operation
2. some non-related db operation

在这种情况下,第一次操作不会阻止第二次操作。第二次操作在第一次之后立即执行(无需等待完成)

然而,也有一些场景,如:

1. some db operation 
2. some related db operations(which you can't put in callbacks) and forcefully want to be after 1st operation.

然后使用fs.writeFileSync.

Synchronous是一个阻塞调用,线程被阻塞,直到调用结束。异步是一个非阻塞调用,线程继续执行其余部分,这就是为什么调用是单独执行的。

引用NodeJS文档:

阻塞是指在Node.js中执行额外的JavaScript进程必须等待非JavaScript操作完成。这由于事件循环无法继续运行而发生在发生阻塞操作时使用JavaScript。

阻塞方法同步执行非阻塞/strong>。

异步方法与同步方法的使用:

如果您调用的是一个扩展操作,如I/O操作(文件、数据库访问等),请使用Async方法,因为您不想在执行扩展操作时阻塞整个过程。

但是,如果它是一个常规调用,其结果对进程的其余部分起作用很重要,请使用Sync方法,在该方法中,进程将停止,直到调用完成。

例如,如果您正在使用AWS lambda,则进行异步调用(将异步执行I/O操作),可能会在进程的其余部分完成后立即终止lambda函数。因此,确定何时使用同步调用和异步调用非常重要。

有关更多信息,请阅读以下文档。