为什么 Node.js 是单线程语言?2025年2月15日 | 阅读 4 分钟 Node.js 是单线程和多线程的,但更准确地说,它是单线程的。它在单个线程上运行给定的 JavaScript 代码。它在主线程上只处理一个任务。然而,它也有一些多线程功能。它提供了工作线程(worker threads),这对开发者来说是一个很好的优势,因为他们可以创建额外的线程来处理多个任务,这是并行处理的一部分。Node.js 使用一个名为 "libuv" 的库,该库包含一个线程池,允许在后台运行多个任务,这样它们就不会阻塞主线程。 在 Node.js 中,有两种类型的线程:主线程和后台线程。主线程会运行主代码并处理事件和回调。与此同时,其他任务在后台运行。这使得 Node.js 成为一个具有多线程优势的单线程环境。 为了理解 Node.js 的单线程特性,我们必须了解事件驱动架构和非阻塞异步输入输出操作。 事件驱动架构让我们以一家只有一名服务员的餐厅为例。服务员有很多任务,比如从顾客那里点餐、下单、打扫桌子和为多个桌子服务。在这里,服务员首先向所有顾客点餐,然后他去下单。在餐准备好之前,他会打扫桌子;打扫完之后,他会检查餐是否准备好了。如果餐准备好了,他会一张桌子一张桌子地为顾客服务。服务员在这里不停地工作,没有休息;他能同时高效地处理许多任务,但一次只能做一件事情。 Node.js 的工作方式就像餐厅里的服务员一样。 主线程充当服务员,后台线程充当厨房工作人员,它们执行 I/O 操作,就像工作人员制作食物一样。铃声响了就像回调一样,表示任务已完成。 事件驱动架构是根据软件识别的事件工作的程序流程。用户操作和传感器输出是一些事件的例子。该架构的关键组件是事件循环、事件发射器和事件处理器。事件循环管理代码的执行。它收集所有处理事件并将队列中的子任务执行。事件发射器使应用程序的各个部分发出事件。事件处理器将处理事件。 这种架构以其异步处理、非阻塞特性和高效的资源利用而闻名。任务是异步处理的,主线程不需要等待其他任务完成。主线程将处理其他事件,直到当前任务完成。它非常有效地利用系统资源。 异步编程它允许 Node.js 独立执行任务。这对于处理需要较长时间才能完成的任务很有用;一些任务是输入输出操作、网络请求和数据库查询,因此这些任务必须在不停止主线程的情况下完成。回调、Promise、async 和 await 在异步编程中起着至关重要的作用。回调是将函数作为参数传递给另一个函数的函数。异步操作完成后,它将执行。Promise 是表示操作状态的对象,无论它是成功、失败还是待定。Async 和 await 是在使用 Promise 时使用的语法,可以让异步代码看起来像同步代码。 事件循环当 Node.js 接收一个任务时,它会将该任务放入事件队列。该任务会等待队列中的其他任务被处理。事件循环将遍历事件队列。当从事件队列中取出一个特定任务时,它将进入执行阶段,在那里进行处理和执行。对于某些输入输出操作,线程将在后台运行,并且与任务关联了回调。每当任务完成时,主任务就会被放入队列,这个任务也会经历上述过程才能被处理。 Node.js 处理简单任务的流程。
下一个主题Flask 和 Node.js 的区别 |
在本文中,我们将讨论一些关于 Node.js 必须了解的有趣事情。在讨论 Node.js 的重要事情之前,我们必须了解 Node.js。什么是 Node.js?Ryan Dahl 于 2009 年发布了 Node.js,开发人员因其效率而迅速采用它......
阅读 4 分钟
随着 Node.js(基于 Chrome V8 引擎的稳定 JavaScript 运行时)的发布,可伸缩网络应用程序开发变得越来越流行。非阻塞 I/O 模型的主要优点是其改进的可伸缩性。非阻塞方法采用异步方法。异步程序逐行执行...
阅读 4 分钟
在现代应用程序开发中,性能监控对于提供流畅的用户交互至关重要。Node.js 开发人员在新 Relic 和 Dynatrace 之间选择他们首选的应用程序性能监控 (APM) 工具选项。APM 平台 New Relic 和 Dynatrace 提供复杂的监控解决方案和检测功能...
阅读 4 分钟
Netty 和 Node.js 都是用于开发网络应用程序的工具。本文将讨论 Netty 和 Node.js 之间的区别,包括它们的特性、目标和设计。下面是 Node.js 与 Netty 的全面比较:什么是 Netty?NIO 客户端-服务器框架 Netty 使...
5 分钟阅读
在本文中,您将了解 Node.js verify.verify(object, signature[, signatureEncoding]) 函数及其语法、参数和示例。Node.js verify.verify(object, signature[, signatureEncoding]) 函数是什么?Node.js crypto 模块的 verify.verify(object, signature[, signatureEncoding]) 函数用于确认数字签名的真实性。通过使用匹配的私...
阅读 4 分钟
Node.js 的 util 模块包含 util.types.isRegExp() 函数。它的主要目的是在需要时修改内部 Node.js API。此方法用于确定给定值是否为正则表达式。Node.js util.types.isRegExp() 函数提供了许多有用的功能来简化开发....
阅读 4 分钟
模块是组织代码成可重用部分的方式。它是 Node.js 的基本概念。CommonJS 和 es6 模块(也称为 ES 模块或 ECMAScript 模块)是两种流行的模块系统。尽管它们的目的相同,但存在一些差异……
阅读 4 分钟
Web 开发中使用的包管理器,如 npm 和 bower,有着不同的用途和应用,尤其是在 JavaScript 和前端开发方面。在本文中,我们将讨论 npm 和 Bower 之间的区别。在讨论它们的区别之前,我们必须了解关于……
阅读 4 分钟
Multer 是一个 Node.js 中间件,用于通过 multipart/form-data 接收文件上传。它建立在 Busboy(一个高效处理请求中传入的 HTML 表单数据的 node.js 模块)之上。Multer 类似于 Node.js 中的 body-parser(一个 express 中间件),但它专门用于...
阅读 4 分钟
Node.js 中的线程是单个进程的执行。它是一个小型处理器,可以在同一进程中的其他线程并发工作。它位于进程内存中,并包含一个执行指针。它有自己的堆栈,但...
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India