iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Node.js 中怎么实现多线程和多进程
  • 218
分享到

Node.js 中怎么实现多线程和多进程

2024-04-02 19:04:59 218人浏览 安东尼
摘要

这期内容当中小编将会给大家带来有关node.js 中怎么实现多线程和多进程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。为什么要用 nodejs?javascript 最

这期内容当中小编将会给大家带来有关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) => {});

(1) 当工作线程中有未捕获的异常时发出。接下来工作线程终止,并且该错误可以作为回调中的第一个参数使用。

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

(2) 当辅助线程退出时发出。如果在工作线程中调用了 process.exit(),则会将 exitCode 提供给回调。如果  worker.terminate() 终止工作线程,则代码为 1。

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

(3) 当工作线程将数据发送到父线程时发出。

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

(4) 当工作线程停止解析 JS 代码并开始执行时发出。尽管不常用,但 online 事件在特定情况下可能会提供更多信息。

使用工作线程的方式

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

  • 方法 1 – 涉及产生工作线程,执行其代码并将结果发送到父线程。此方法需要每次为新任务从头创建新的 worker 线程。

  • 方法 2 – 涉及生成 worker  线程并为消息事件设置侦听器。每次触发该消息时,辅助线程都会执行代码,并将结果发送回父线程。辅助线程保持活动状态,以备将来使用。

方法 2 也被称为工作池。这是因为该方法涉及创建 worker 的工作池,先让他们等待,并在需要时去调度消息事件来执行任务。

由于从头创建工作线程需要创建虚拟机以及解析和执行代码,因此官方 Node.js 文档 建议采用方法 2。此外,方法 2 更为实用,比方法 1  更有效。

(1) worker_threads 模块中可用的重要属性

  • isMainThread – 当不在工作线程内操作时,此属性为 true。如果需要,则可以在 worker 文件的开头包含一个简单的 if  语句。这样可以确保它仅作为工作线程运行。

  • parentPort – MessagePort 的实例,用于与父线程进行通信。

  • threadId – 分配给工作线程的唯一标识符。

  • workerData – 包含在 worker 线程的构造函数中的数据。

(2) Node.js 中的多进程

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

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

(3) 后端的 Node.js

互联网已经成为全球数以百万计公司的首选平台。因此,为使一家企业发挥最大潜力,并在此过程中脱颖而出,必须拥有强大的网络形象。

这一切都始于一个强大而直观的网站。要打造一个完美无瑕的网站,重要的是选择最佳的前端和后端技术。尽管本质上是单线程的,但 Node.js 是开发后端 Web  服务的首选。

尽管有大量的后端多线程选择,但知名公司还是喜欢 Node.js。这是因为 Node.js 提供了在 JavaScript 中使用多线程的变通方法,而  JavaScript 已经是“Web上最流行的编程语言”。

上述就是小编为大家分享的Node.js 中怎么实现多线程和多进程了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网JavaScript频道。

--结束END--

本文标题: Node.js 中怎么实现多线程和多进程

本文链接: https://www.lsjlt.com/news/74149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Node.js 中怎么实现多线程和多进程
    这期内容当中小编将会给大家带来有关Node.js 中怎么实现多线程和多进程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。为什么要用 NodeJSJavaScript 最初...
    99+
    2024-04-02
  • Node.js中的多进程和多线程实例分析
    本篇内容主要讲解“Node.js中的多进程和多线程实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中的多进程和多线程实例分析”吧!我们都知道...
    99+
    2024-04-02
  • Node.js中怎么实现多线程
    Node.js中怎么实现多线程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Node.js 是如何工作的Node.js 使用两种线程:ev...
    99+
    2024-04-02
  • Node.js 中怎么实现多进程
    Node.js 中怎么实现多进程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Node.js 多进程Node.js本身是以单线程的模式运行的,...
    99+
    2024-04-02
  • Node.js + worker_threads怎么实现多线程
    这篇文章主要介绍“Node.js + worker_threads怎么实现多线程”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node.js + worker_th...
    99+
    2024-04-02
  • python多线程和多进程(二)
    ---恢复内容开始--- 一、多进程   1、multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。 import time from mult...
    99+
    2023-01-30
    多线程 进程 python
  • python socket多线程和多进程
    在socket中,如果直接创建的话,是只能接受一个用户的请求需要实现socketserver中的handle方法,可以实现多进程并发访问 SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理...
    99+
    2023-01-31
    多线程 进程 python
  • python多进程和多线程介绍
    目录一、什么是进程和线程 二、多进程和多线程 三、python中的多进程和多线程1、多进程2、多线程一、什么是进程和线程  进程是分配资源的最小单位,线...
    99+
    2024-04-02
  • python多进程和多线程的实际用法
    这篇文章主要讲解了“python多进程和多线程的实际用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python多进程和多线程的实际用法”吧!  写在前面  总所周知,unix/linux...
    99+
    2023-06-02
  • Python进阶之多线程怎么实现
    这篇文章主要介绍“Python进阶之多线程怎么实现”,在日常操作中,相信很多人在Python进阶之多线程怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python进阶之多线程怎么实现”的疑惑有所帮助!...
    99+
    2023-07-06
  • node的多进程和多线程是什么
    今天小编给大家分享一下node的多进程和多线程是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2024-04-02
  • Nodejs中怎么实现多线程
    Nodejs中怎么实现多线程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1 背景需求中有以下场景1 对称解密、非对称解密2 压缩、解压3...
    99+
    2024-04-02
  • HTML5中怎么实现多线程
    这篇文章将为大家详细讲解有关HTML5中怎么实现多线程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、明确 JavaScript 是单线程JavaScript 语言的一大特点就是单线程,也...
    99+
    2023-06-09
  • VB.NET中怎么实现多线程
    本篇文章为大家展示了VB.NET中怎么实现多线程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。VB.NET(Visual Basic.NET)是为适应Microsoft .NET框架的需要,对Vis...
    99+
    2023-06-17
  • Java中多线程怎么实现
    这篇文章主要讲解了“Java中多线程怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中多线程怎么实现”吧!线程是一些可以并行的,独立的执行的代码.之前我编的程序都只能做一件事情...
    99+
    2023-06-03
  • Node.js多进程模型中怎么实现共享内存
    本篇文章为大家展示了Node.js多进程模型中怎么实现共享内存,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Node.js 由于其单线程模型的设计,导致一个Node...
    99+
    2024-04-02
  • 什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?
    文章目录 前言我们为什么要使用线程而不是进程来实现并发编程什么是线程进程和线程的区别如何使用Java实现多线程创建线程1.创建一个继承 Thread 类的线程类2.实现 Runnable 接口匿名内部类方式实现 Runnable ...
    99+
    2023-08-19
    java JavaEE 多线程 进程
  • 异步 PHP — 多进程、多线程和协程
    让我们看一下这段典型的 PHP 代码: function names(){ $data = Http::get('data.location/products')->json(); $names = []; foreach...
    99+
    2023-09-09
    servlet json java
  • TCP服务器实现—多进程版,多线程版,线程池版
    目录 前言 1.存在的问题 2.多进程版 3.多线程版 4.线程池版 总结 前言         在上一篇文章中使用TCP协议实现了一个简单的服务器,可以用来服务端和客户端通信,但是之前的服务器存在一个问题,就是当有多个客户端连接服...
    99+
    2023-08-31
    服务器 tcp/ip 运维
  • python多线程及多线程有序性怎么实现
    这篇文章主要介绍了python多线程及多线程有序性怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python多线程及多线程有序性怎么实现文章都会有所收获,下面我们一起来看看吧。前言多线程一般用于同时调用...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作