您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    Node.js 中的多线程和多进程
    时间:2021-08-08 21:12 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    Node.js 中的多线程和多进程

    由于 Node.js 的非阻塞性质,不同的线程执行不同的回调,这些回调首先委托给事情循环。Node.js 运转时担任处置一切这一切。

    为什么要运用NodeJS?

    JavaScript 最后是作为一种单线程编程言语构建的,仅在 Web 阅读器中运转。这意味着在一个进程中,只要一组指令可以在给定的时间执行。

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

    最后,JavaScript 关于仅用于向网站添加大批交互。所以并没有对多线程的需求。但是时代曾经变了,用户要求也越来越高,JavaScript 已成为“Web 下盛行的编程言语”。

    多线程如今变得很普遍。由于 JavaScript 是单线程言语,因此无法在其中完成多线程。幸运的是,在这种状况下,有一个很好的处置办法:Node.js。

    Node.js 框架并不少,这要归功于 JavaScript 运转时环境(尤其是 JavaScript)的普遍盛行。在继续本文之前,让我们了解一些有关 Node.js 的重要观念:

    可以用 send 函数将音讯从子进程传递到其他子进程和主进程

    支持 fork 多个进程

    主进程和子进程之间不共享形状

    为什么要 fork 进程?

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

    经过将义务委派给其他进程来提高速度

    用于释放内存和卸载单个进程

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

    Node.js 的方式

    Node.js 运用两种类型的线程:

    经过事情循环处置主线程,

    任务池中有许多辅佐线程

    事情循环担任获取回调或函数,并将其注册以供未来执行。它与正确的 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 类的实例时,有两个参数:

    第一个参数提供扩展名 .js 或 .mjs 的文件途径,其中包含任务顺序线程的代码,

    第二个参数提供了一个包含 workerData 属性的对象,该属性包含任务线程末尾执行时将拜访的数据

    辅佐线程可以调度多个音讯事情。因此,回调办法优先于前往 promise。

    任务线程之间的通讯是基于事情的,即侦听器设置为在任务线程发送事情后立刻调用。最常见的 4 个事情是:

    worker.on('error', (error) => {}); 

    当任务线程中有未捕获的异常时收回。接上去任务线程终止,并且该错误可以作为回调中的第一个参数运用。

    worker.on('exit', (exitCode) => {}) 

    当辅佐线程参加时收回。假设在任务线程中调用了 process.exit(),则会将 exitCode 提供应回调。假设 worker.terminate() 终止任务线程,则代码为 1。

    worker.on('message', (data) => {}); 

    当任务线程将数据发送到父线程时收回。

    worker.on('online', () => {}); 

    当任务线程中止解析 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、大数据和机器学习等计算密集型范围的开发人员、工程师和其他专业人员。

    【编辑引荐】

    炒币机器人替代人工买卖,系统开发在提高

    Stack Overflow 最新开发者调查报告:Rust 最受喜欢、PostgreSQL 最受欢迎

    开发文档代码示例工程Dialog的完全解析

    技术开发新运用,区块链开发新场景

    顺序员开发进度太慢被告上法庭!公司索赔90万,拿百度词条当证据

    (责任编辑:admin)