【问题标题】:Can someone please Explain me how is Nodejs single threaded being Asynchronous [duplicate]有人可以解释一下Nodejs单线程是如何异步的[重复]
【发布时间】:2022-01-11 04:54:52
【问题描述】:

我读过

Node.js 是单线程的,即它以单个顺序或方向执行代码。在给定时间,仅执行单个任务/调用。异步和 单线程:执行不等待当前请求完成 并移至下一个请求/调用。

我对单线程和异步这两个感到困惑。如果我在一个任务是 setTimeout 时执行一些操作序列,另一个是从 API 获取数据,另一个是一些算术运算,那么流程是如何处理的?那么考虑到单线程的操作顺序是什么?

【问题讨论】:

  • 研究javascript事件循环。
  • 异步基本上是一个delayed execution..
  • 当你做单线时,比如折叠你的衣服......你发现一件没有正确洗涤的衣服,你把它扔到一边待会处理。
  • @SilvanBregy - 延迟执行根本不是异步操作的适当描述。当您执行fs.read() 时,根本不会延迟执行。操作立即启动,然后函数立即返回。操作在后台进行,一段时间后,您会在完成后通过回调函数收到通知。这次执行没有任何“延迟”。 setTimeout() 是一种安排一些代码在未来某个时间点运行的方法,因此这是唯一可能延迟执行的地方。
  • @SilvanBregy jfriend00 是对的。这更像是一种延迟的解决方案,因此动作可以现在发生,但其最终结果稍后

标签: javascript node.js asynchronous


【解决方案1】:

在这种情况下,“单线程”意味着它在单线程中运行您的 Javascript。这意味着它会运行一段 Javascript,直到将控制权返回给系统,然后才能运行附加到其他事件的代码。没有两段 Javascript 会同时执行。

仅供参考,为了讨论的目的,我们在这里忽略了 WorkerThreads,这是一种运行多个 Javascript 线程的有目的的方式,但不涉及一般的异步架构。

异步操作全部由 nodejs 在本机代码(通常是 C/C++ 代码)中实现。它们是诸如计时器、网络操作、磁盘操作等之类的东西……本机代码(主要在一个名为 libuv 的跨平台库中)在 Javascript 中具有允许您调用它们的接口,例如 http.request() 或 @987654323 @,但这些函数的底层核心实现是在本机代码中。这些操作的本机代码可能会或可能不会在其实现中实际使用操作系统线程。但是,这些线程对 Javascript 代码完全隐藏。

例如,nodejs 中的网络操作不使用线程。它们在操作系统中使用本机异步 API,允许它们在网络操作完成时收到通知,而不会阻塞或旋转并等待它。其他异步操作(例如文件操作)实际上使用本地操作系统线程池来“模拟”异步架构。

因此,当您的 Javascript 作为单线程运行时,可以同时进行多个异步操作。如果你看这段代码:

const fsp = require('fs').promises;

Promise.all([fsp.readFile("filea.txt"), fsp.readFile("fileb.txt")]).then(results => {
   console.log(results[0]);
   console.log(results[1]);
}).catch(err => {
   console.log(err);
});

这将并行读取两个文件,并告诉您两个文件中的数据何时可用。虽然您的 Javascript 仍然作为单线程运行,但底层文件操作使用操作系统级线程,并且磁盘操作在单独的线程中运行。所以,只有你的实际 Javascript 是单线程的,不一定是底层的异步操作。

幸运的是,您通常可以完全避免多线程编程的并发问题,因为您自己的两段 Javascript 永远不会同时运行。因此,您不需要互斥锁或其他并发设备来安全地写入变量。线程使用的细节被抽象在异步接口后面。而且,nodejs 如何处理这些异步接口的完成的事件驱动性质决定了一段 Javascript 将在可以处理具有下一个异步结果的下一个完成事件之前运行完成。

【讨论】:

    猜你喜欢
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多