首页 > 系统相关 >Node JS 多进程

Node JS 多进程

时间:2023-11-16 09:34:04浏览次数:40  
标签:Node const process worker JS file error 进程

在 Node.js 中,可以使用多个进程来处理文件,并发执行任务以提高性能和效率。多进程可以提高应用程序的性能和可靠性,但同时也会带来一些额外的开销和复杂性问题

优点

可以高效利用多核 CPU ,将许多并发请求分配到不同的进程中处理,来提高应用程序性能。

提高可靠性,多进程互相隔离,当一个进程崩溃或出现问题时,其他进程应该能够继续工作,不会影响整个应用程序的运行。

缺点

多进程开销更大,需要更多的内存和 CPU 资源来维护进程通信和进程间数据同步。

多进程本身就是一种分布式运行模式,会增加维护和调试难度

进程间通信和信息同步复杂,可能导致性能与内存问题。

 

具体有两种方式:

  1. 使用 child_process 模块:child_process 模块允许你创建子进程并与其进行通信。你可以使用 child_process.fork() 方法创建多个子进程,每个子进程负责处理一个文件或一组文件。通过进程间的消息传递,我们可以在主进程和子进程之间共享数据和任务。这种方式适用于文件处理任务比较独立且相互之间没有太多的依赖关系的情况。
  2. 使用进程池:进程池是一组预先创建的子进程,可以通过将任务分配给空闲的子进程来提高处理能力。我们可以使用 worker_threads 模块来创建进程池。

 

下面实例中分别使用了child_process(async_process 方法)创建子进程与worker_threads(assignTaskToWorkers 方法)创建进程池:

process.js:

import ipcMain from '../ipcMain';
const { fork } = require('child_process');
const { Worker } = require('worker_threads');
const path = require('path');

class FileProcess {
  constructor() {
    this.process = null;
    this.workerPool = new Set();

    ipcMain.ipc.on("async_update_file", this.async_update_file.bind(this))
  }

  async_update_file(event, arg) {
    const files = arg.files;
    if(files.length === 1) {
      this.async_process(files[0]);
    } else {
      this.assignTaskToWorkers(files);
    }
  }

  async_process(file) {
    // 创建子进程
    const childPath = path.join(process.cwd(), '/src/main/process/fileProcessor.js');
    const child = fork(childPath);

    // 向子进程发送消息
    child.send(file);

    // 监听子进程的消息
    child.on('message', (data) => {
      console.log(`子进程返回结果:${data}`);
    });

    // 监听子进程的错误
    child.on('error', (error) => {
      console.error(`子进程发生错误:${error}`);
    });
  }

  // 添加任务到进程池
  addToWorkerPool(file) {
    const childPath = path.join(process.cwd(), '/src/main/process/fileWorker.js');
    const worker = new Worker(childPath, { workerData: file });

    worker.on('message', (data) => {
      console.log(`子进程返回结果:${data}`);
      this.workerPool.delete(worker);
      worker.unref();
    });

    worker.on('error', (error) => {
      console.error(`子进程发生错误:${error}`);
      this.workerPool.delete(worker);
      worker.unref();
    });

    this.workerPool.add(worker);
    // console.log('this.workerPool', this.workerPool)
  }

  // 分配任务到进程池
  assignTaskToWorkers(files) {
    files.forEach((file) => this.addToWorkerPool(file));
  }
}

export default FileProcess;

 

fileProcessor.js

const fs = require('fs');

process.on('message', (file) => {
  console.log('file=======', file)
  // 处理文件
  try {
    const data = fs.readFileSync(file, 'utf8');
    const processedData = processData(data);
    process.send(processedData);
  } catch (error) {
    process.send(`文件处理出错:${error.message}`);
  }
});

function processData(data) {
  // 进行文件处理逻辑示例
  return data.toUpperCase();
}

 

fileWorker.js

const { workerData, parentPort } = require('worker_threads');
const fs = require('fs');

// 读取 workerData 中指定的文件
const file = fs.readFileSync(workerData, 'utf8');

// 处理数据(此处只是简单地转换为大写字母)
const upperCaseData = file.toUpperCase();

// 返回处理结果
parentPort.postMessage(upperCaseData);

 

 

 

 

 

 

 

 

 

 

 

 

async_process

标签:Node,const,process,worker,JS,file,error,进程
From: https://www.cnblogs.com/juexin/p/17835462.html

相关文章

  • 在js中,定义了两个同名函数后, 后面的函数会覆盖前面定义的函数。
    运行以下程序<script>varm=1,j=k=0;functionadd(n){returnn=n+1;}y=add(m);functionadd(n){returnn=n+3;}z=add(m);</script>A2,4B4,4C2,2D报异常正确答案:Bjs里面没有函数重载的......
  • commonJS四个重要环境变量:require、exports、module、global
    按照CommonJS规范,在任何模块代码的作用域下内置了以下哪些变量?AmoduleBcontextCrequireDexports正确答案:ACD浏览器不兼容CommonJS的根本原因,在于缺少四个Node.js环境的变量。commonJS四个重要环境变量:require、exports、module、global......
  • Cocos Creator之MAC平台protobufjs
    一,环境MAC二,安装brew1,命令(不必要)/bin/zsh-c"$(curl-fsSLhttps://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"2,安装2.1,命令[email protected],安装位置/usr/local/lib/node_modules/protobufjs/dist三,准备一个proto测试文件(test.proto)packag......
  • 强制关闭xxx进程
    目录基本语法举个......
  • setTimeout 是浏览器环境提供的,JS 标准没有规定。不是JavaScript的全局函数,是浏览器(宿
    下列哪些函数是JavaScript的全局函数?AencodeURIBparseFloatCsetTimeoutDeval正确答案:ABD答案:A、B、D个人记忆方法:6(编码相关)+2(数据处理)+4(数字相关)+1(特殊)编码相关:escape()、unescape()、encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent......
  • 【misc】[SDCTF 2022]Flag Trafficker --jsFuck代码
    附件下载下来是一个流量包,用wireshark打开该流量包,然后搜索字符串"flag",就会出现如下的jsfuck代码右键onlick显示分组字节可以看到很大一串的jsfuck代码,现在是需要运行这段代码,可利用在线网站运行:JSFuck-在线加解密(bugku.com),运行完就是flag还可以保存为html文件在浏......
  • Jsoncpp的使用
    目录动态库和静态库生成Jsoncpp的使用value类构造函数检测保存的数据类型将value对象转换为实际类型对json数组的操作对json对象的操作将Value对象数据序列化为stringfastwriter类reader类VS的配置简单的示例代码动态库和静态库生成https://github.com/open-source-parsers/jso......
  • 【开源】基于Vue.js的高校实验室管理系统
    一、摘要1.1项目介绍基于JAVA+Vue+SpringBoot+MySQL的高校实验室管理系统包含实验室类型模块、实验室档案模块、实验模块、实验设备模块、实验订单模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,高校实验室......
  • 【开源】基于Vue.js的衣物搭配系统的设计和实现
    一、摘要1.1项目介绍基于Vue+SpringBoot+MySQL的衣物搭配系统,包含衣物档案模块、衣物搭配模块、衣物收藏模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,衣物搭配管理系统基于角色的访问控制,给普通用户、衣物......
  • 使用js判断颜色是否相等,然后投票
    首先做出来的效果图是这样的代码如下<divclass="hua_zdm_15"id="toupiao"><divclass="hua_zd_00_z"onclick="zd_change(0)">涨</div><divclass="hua_zd_00_dm_20"onclick="zd_change(1)">跌&......