热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Nodejs如何开启多进程,进程如何通讯

最重要的一句话刻在心里:JS是单线程的进程(process)和线程(thread)的区别进程,

最重要的一句话刻在心里:JS是单线程的


进程(process)和线程(thread)的区别


  • 进程,OS 进行资源分配和调度的最小单位,有独立内存空间
  • 线程,OS 进行运算调度的最小单位,共享进程内存空间

为何需要多进程


  • 多核 CPU,更适合处理多进程
  • 内存较大,多个进程才能更好的利用(单进程有内存上限)

总之,是为了“压榨”机器资源。


Nodejs 开启多进程的方式:


  • webWorker 方式开启多进程(此方法在浏览器中也可以使用,我的使用例子就是 webview 中,Custom Dashboard 项目里面,为了和 desktop 进行通讯,会使用 webWorker.postMessage() 方法发送数据给 desktop,使用 window.addEventListener(“message”, () => {}) 来接收 desktop 的数据)
  • fork
  • cluster

使用 child_process.fork 方式

const fork = require("child_process").fork;

下面 demo 一个创建子进程的例子,该例子先创建一个 server,启动服务之后访问 localhost:3000/get-sum ,页面会打印 sum is 4995500 字符串。

// process.js
const http = require("http");
const fork = require("child_process").fork;const server = http.createServer((req, res) => {if (req.url === "/get-sum") {console.info("主进程 id", process.pid);// 开启子进程const computeProcess = fork("./compute.js");computeProcess.send("开始计算");// 接收子进程的消息computeProcess.on("message", data => {console.info("主进程接收到的信息:", data);res.end("sum is " + data);});// 接收意外情况computeProcess.on("close", () => {console.info("子进程因报错而退出");res.end("error");})}
});
server.listen(3000, () => {console.info("localhost:3000");
});

// compute.js
/*** &#64;description 子进程&#xff0c;计算*/function getSum() {let sum &#61; 0;for (let i &#61; 0; i< 10000; i &#43;&#43;) {sum &#43;&#61; i;}return sum;
}// 接收主进程的消息
process.on("message", data &#61;> {console.info("子进程 id", process.pid);console.info("子进程接收到的信息&#xff1a;", data);const sum &#61; getSum();// 发送消息给主进程process.send(sum);});

使用 cluster 方式

运行 node cluster.js&#xff0c;访问 localhost:3000&#xff0c;页面会打印出 done。

// cluster.js
const http &#61; require("http");
// 根据 cpu 的核数来决定开启进程的数量
const cpuCoreLength &#61; require("os").cpus().length;
const cluster &#61; require("cluster");// 如果是主进程&#xff0c;就开启子进程
if (cluster.isMaster) {for (let i &#61; 0; i < cpuCoreLength; i &#43;&#43;) {cluster.fork(); // 开启子进程}cluster.on("exit", worker &#61;> {console.info("子进程退出");cluster.fork(); // 进程守护&#xff0c;再次开启子进程});
} else {// 子进程// 多个子进程会共享一个 TCP 连接&#xff0c;提供一份网络服务const server &#61; http.createServer((req, res) &#61;> {res.writeHead(200);res.end("done");});server.listen(3000);
}

但是&#xff0c;实际工作中&#xff0c;我们想要进程守护&#xff0c;会用 pm2 这个包&#xff0c;开启多个进程。


使用 send 和 on 来进行通讯


推荐阅读
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 最详尽的4K技术科普
    什么是4K?4K是一个分辨率的范畴,即40962160的像素分辨率,一般用于专业设备居多,目前家庭用的设备,如 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 基于Web的Kafka管理工具Kafkamanager首次访问Web界面的详细配置指南(附图解)
    首次访问Kafkamanager Web界面时,需要对Kafka集群进行配置。这一过程相对简单,用户只需依次点击【Cluster】>【Add Cluster】,按照提示完成相关设置即可。本文将通过图文并茂的方式,详细介绍每一步的配置步骤,帮助用户快速上手Kafkamanager。 ... [详细]
  • 深入浅出 webpack 系列(二):实现 PostCSS 代码的编译与优化
    在前一篇文章中,我们探讨了如何通过基础配置使 Webpack 完成 ES6 代码的编译。本文将深入讲解如何利用 Webpack 实现 PostCSS 代码的编译与优化,包括配置相关插件和加载器,以提升开发效率和代码质量。我们将详细介绍每个步骤,并提供实用示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 当使用 `new` 表达式(即通过 `new` 动态创建对象)时,会发生两件事:首先,内存被分配用于存储新对象;其次,该对象的构造函数被调用以初始化对象。为了确保资源管理的一致性和避免内存泄漏,建议在使用 `new` 和 `delete` 时保持形式一致。例如,如果使用 `new[]` 分配数组,则应使用 `delete[]` 来释放内存;同样,如果使用 `new` 分配单个对象,则应使用 `delete` 来释放内存。这种一致性有助于防止常见的编程错误,提高代码的健壮性和可维护性。 ... [详细]
  • 使用 Vuex 管理表单状态:当输入框失去焦点时自动恢复初始值 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了移动web性能测试笔记之一相关的知识,希望对你有一定的参考价值。收集整理@2017/12/16 ... [详细]
  • 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4277。作者:Bob Lee,日期:2012年9月15日。题目描述:给定n个木棍,求可以组成的不同三角形的数量,最多15根木棍。 ... [详细]
  • 前言作为一个移动端初学者、爱好者,能使用前端技术开发原生游戏一直是一件渴望而不可及的事情,暂且不说游戏逻辑的复杂度,算法的健壮性ÿ ... [详细]
  • 安卓端开源移动浏览器开源项目
    进入android开发以来,webview用的比较多,后来又看了一些基于webview的浏览器代码,慢慢的将积累的东西做成了一个安卓移动浏 ... [详细]
author-avatar
安乐乐520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有