热门标签 | 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 来进行通讯


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 解决文件名过长下载失败问题的jQuery方案
    本文介绍了使用jQuery解决文件名过长导致下载失败的问题。原方案中存在文件名部分丢失的问题,通过动态生成隐藏域表单并提交的方式来解决。详细的解决方案和代码示例在文章中给出。 ... [详细]
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社区 版权所有