百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>JS教程> 深入理解Node.js 中的多线程和多进程
分享文章到:

深入理解Node.js 中的多线程和多进程

发布时间:10/01 来源:未知 浏览: 关键词:

Node.js 是一个免费的跨平台 JavaScript 运转时环境,尽管它本质上是单线程的,但是可以在后台使用多个线程来施行异步代码。

由于 Node.js 的非堵塞性质,不一样的线程施行不一样的回调,这些回调第一拜托给事件轮回。 Node.js 运转时负责处置所有这一切。

为什么要使用NodeJS?

JavaScript 最初是作为一种单线程编程说话构建的,仅在 Web 阅读器中运转。这意味着在一个历程中,只要一组指令能够在给定的时间施行。

仅在当前代码块的施行完成后,才移至下一个代码块。但是,JavaScript 的单线程性质使实现变得容易。

最初,JavaScript 关于仅用于向网站增加少量交互。所以并没有对多线程的需求。但是时代已经变了,会员要求也越来越高,JavaScript 已成为“Web 上流行的编程说话”。

多线程此刻变得很遍及。由于 JavaScript 是单线程说话,因此没法在其中实现多线程。荣幸的是,在这种状况下,有一个很好的解决办法:Node.js。

Node.js 框架并不少,这要归功于 JavaScript 运转时环境(特别是 JavaScript)的遍及流行。在连续本文此前,让我们理解一些有关 Node.js 的重要观念:

  1. 可以用 send 函数将新闻从子进程传递到其他子进程和主进程
  2. 支撑 fork 多个进程
  3. 主进程和子进程之间不同享状态

为什么要 fork 进程?

在两种状况下,我们需要 fork 一个流程:

  1. 通过将任务委派给其他进程来提高速度
  2. 用于开释内存和卸载单个进程

可以将数据发送到子进程,也可以将其送回。

Node.js 的方式

Node.js 使用两品种型的线程:

  1. 通过事件轮回处置主线程,
  2. 工作池中有很多辅助线程

事件轮回负责猎取回调或函数,并将其注册以供未来施行。它与准确的 JavaScript 代码在统一线程中运转。一旦 JavaScript 操纵堵塞了线程,事件轮回也会被堵塞。

工作池是一个施行模型,负责发生和处置不一样的线程。它同步施行任务,然后将结果返回到事件轮回,最后事件轮回将结果供给给回调。

总而言之,工作池负责异步 I/O 操纵,即与系统磁盘和网络的交互。像 fs 和 crypto 这样的模块是使用工作池的主要模块。

由于工作池是在 libuv 库中实现的,Node.js 在 JS 和 C++ 之间停止内部通讯时会稍有延迟。不外这几乎是不成发觉的。

一切都很好,直到我们碰到同步施行复杂操纵的要求。任何需要大量时间施行的函数都会致使主线程堵塞。

假如程序具有多个占用大量 CPU 的函数,将会致使效劳器吞吐量的明显下落。在最坏的状况下,效劳器将会失去响应,并且没法将任务委派给工作池。

诸如 AI、大数据和机器学习之类的领域没法从 Node.js 中受益,由于这些操纵堵塞了主线程,并使效劳器失去响应。但是这随着 Node.js v10.5.0 的到来而改动,该版本增添了对多线程的支撑。

并发和 CPU 绑定任务的挑衅

在 JavaScript 中创立并发大概很艰难。同意多个线程拜访雷同的内存会致使竞争状态,这不仅使故障难以重现,并且解决起来也很艰难。

Node.js 最初被实现为基于异步 I/O 的效劳器端平台。通过简便地消弭线程需求,这使许多事情变得容易。是的,Node.js 程序是单线程的,但不是典型的方式。

我们可以在 Node.js 中并交运行,但是不需要创立线程。操纵系统和虚拟机共同并行使用 I/O,然后在需要将数据发送回 JavaScript 代码时,JS 代码在单个线程中运转。

除 JS 代码外,所有内容均在 Node.js 中并交运行。与异步块不一样,JS 的同步块总是一次施行一次。与代码施行比拟,等候 JS 中发生 I/O 事件所话费的时间要多得多。

Node.js 程序仅调取所需的函数或回调,而不会阻挠其他代码的施行。最初 JavaScript 和 Node.js 都不打算处置 CPU 密集型或 CPU 绑定的任务。

今世码最少时,施行将会是灵敏的。但是运算量越大,施行速度就越慢。

假如你依然尝试在 JS 和 Node 中完成 CPU 密集型任务,那么将会使阅读器中的 UI 冻结并对所有 I/O 事件停止排队处置。尽管如此,我们已经走了很远。此刻有了 worker_threads 模块。

worker_threads 模块使多线程变得简便

Node.js v10.5.0 于 2018 年 6 月公布,引入了 worker_threads 模块。它有助于在流行的 JavaScript 运转时环境中实现并发。该模块同意创立功效齐全的多线程 Node.js 利用。

从技术上讲,工作线程是在独自的线程中发生的一些代码。要开端使用辅助线程,需要先导入 worker_threads 模块。之后需要创立 Worker 类的实例以创立工作线程。

创立 Worker 类的实例时,有两个参数:

  1. 第一个参数供给扩展名 .js 或 .mjs 的文件途径,其中包括工作程序线程的代码,
  2. 第二个参数供给了一个包括 workerData 属性的对象,该属性包括工作线程开端施行时将拜访的数据

辅助线程能够调度多个新闻事件。因此,回调办法优先于返回 promise。

工作线程之间的通讯是基于事件的,即侦听器设定为在工作线程发送事件后马上调取。最常见的 4 个事件是:

worker.on('error', (error) => {});
  1. 当工作线程中有未捕捉的非常时发出。接下来工作线程终止,并且该错误可以作为回调中的第一个参数使用。
worker.on('exit', (exitCode) => {})
  1. 当辅助线程退出时发出。假如在工作线程中调取了 process.exit(),则会将 exitCode 供给给回调。假如 worker.terminate() 终止工作线程,则代码为 1。
worker.on('message', (data) => {});
  1. 当工作线程将数据发送到父线程时发出。
worker.on('online', () => {});
  1. 当工作线程休止解析 JS 代码并开端施行时发出。尽管不常用,但 online 事件在特定状况下大概会供给更多信息。

使用工作线程的方式

有两种使用工作线程的办法:

  • 办法 1 – 触及发生工作线程,施行其代码并将结果发送到父线程。此办法需要每次为新任务从头创立新的 worker 线程。
  • 办法 2 – 触及生成 worker 线程并为新闻事件设定侦听器。每次触发该新闻时,辅助线程都会施行代码,并将结果发送回父线程。辅助线程保持活动状态,以备未来使用。

办法 2 也被称为工作池。这是由于该办法触及创立 worker 的工作池,先让他们等候,并在需要时去调度新闻事件来施行任务。

由于从头创立工作线程需要创立虚拟机乃至解析和施行代码,因此官方 Node.js 文档 倡议采纳办法 2。此外,办法 2 更为有用,比办法 1 更有效。

worker_threads 模块中可用的重要属性

  • isMainThread – 当不在工作线程内操纵时,此属性为 true。假如需要,则可以在 worker 文件的开头包括一个简便的 if 语句。这样可以确保它仅作为工作线程运转。
  • parentPort – MessagePort 的实例,用于与父线程停止通讯。
  • threadId – 分配给工作线程的独一标识符。
  • workerData – 包括在 worker 线程的结构函数中的数据。

Node.js 中的多进程

为了使 Node.js 利用多核系统的功效,可以用一些进程。流行的 javascript 运转时环境中有称被为 cluster 的模块,该模块供给对多进程的支撑。

使用 cluster 模块可以发生多个子进程,这些子进程可以同享一个公共端口。当子进程投入使用时,使用 NodeJS 的系统可以处置更大的工作量。

后端的 Node.js

互联网已经成为环球数以百万计公司的首选平台。因此,为使一家公司发挥最大潜力,并在此历程中锋芒毕露,必需具有强大的网络形象。

这一切都始于一个强大而直不雅的网站。要打造一个完善无瑕的网站,重要的是选中最好的前端和后端技术。尽管本质上是单线程的,但 Node.js 是开发后端 Web 效劳的首选。

尽管有大量的后端多线程选中,但知名公司还是喜爱 Node.js。这是由于 Node.js 供给了在 JavaScript 中使用多线程的变通办法,而 JavaScript 已经是“Web上最流行的编程说话”。

总结

worker_threads 模块供给了一种在 Node.js 程序中实现多线程的简捷办法。通过将沉重的运算委派给工作线程,可以明显提高效劳器的吞吐量。

借助对多线程的支撑,Node.js 将连续吸引越来越多的来自 AI、大数据和机器学习等运算密集型领域的开发人员、工程师和其他专业人员。

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有155人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板