我的网站开发技术经验总结 我的网站开发技术经验总结
首页

fangdown

我的网站开发技术经验总结
首页
  • 大前端

    • nodejs

      • nodejs有哪些全局对象,怎么用
      • 如何在nodejs中实现分页机制功能
      • 如何在nodejs实现文件上传功能
      • 如何实现nodejs鉴权机制,说一下思路
      • 说说nodejs中require的原理
      • 说说nodejs中的EventEmit是如何实现的
      • 说说nodejs中的事件循环机制理解
      • 说说nodejs中进程通信有哪些方式
        • 是什么
        • 怎么用
          • exec 直接执行shell
          • execFile 执行参数
          • spawn
          • fork
        • cluster
        • FAQ
      • 说说nodejs中间件是什么,如何封装一个中间件
      • 说说对buffer的理解及应用场景
      • 说说对fs模块的理解及常用方法
      • 说说对nodejs的理解及应用场景
      • 说说对process的理解及常用方法
      • 说说对stream的理解及应用场景
      • nodejs如何进行性能监控及优化
      • nodejs批量改文件名
    • git

    • CI

    • 小程序

    • docker

    • Typescript

    • webpack

    • 安全

  • 基础

  • 框架

  • 情商

  • 算法

  • 网络

  • 千锤百炼
  • 大前端
  • nodejs
fangdown
2021-08-18
目录

说说nodejs中进程通信有哪些方式

# 是什么

nodejs是单进程单线程,js引擎在主线程上运行,异步事件通过libuv库通过事件循环实现线程调度

# 怎么用

通过child_process模块来实现子进程,有4种方式

  • exec 返回回调,可以执行shell
  • execFile 返回回调
  • spawn 返回流
  • fork 返回流 (node应用,其他均为非node应用)

# exec 直接执行shell

let cp = require("child_process");
cp.exec("echo hello world", function(err, stdout) {
  console.log(stdout); // hello world
});

# execFile 执行参数

let cp = require("child_process");
cp.execFile("echo", ["hello", "world"], function(err, stdout) {
  console.log(stdout);  // hello world
});

# spawn

let cp = require("child_process");
var spawnObj = cp.spawn('ping', ['127.0.0.1'], {encoding: 'utf-8'});
spawnObj.stdout.on('data', function(chunk) {
    console.log(chunk.toString());
});

# fork

let child = cp.fork(__dirname+'/child.js')
child.on('message', function(msg){
  console.log('收到了子进程消息:', msg)
  child.disconnect()
})
child.send('hello world');
// child.js
process.on('message', function(msg){
  console.log('收到父进程消息, 处理中',msg)
  process.send('处理完成, 我来自child')
})

# cluster

意为集成,集成了fork方式及根据cpu多核创建的子进程,自动控制负载均衡的方式

  • master: 主进程
  • worker: 工作进程
  • 目的就是要利用多核,多一个进程处理
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`主进程 ${process.pid} 正在运行`);

  // 衍生工作进程。
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`工作进程 ${worker.process.pid} 已退出`);
  });
} else {
  // 工作进程可以共享任何 TCP 连接。
  // 在本例子中,共享的是一个 HTTP 服务器。
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('你好世界\n');
  }).listen(8000);

  console.log(`工作进程 ${process.pid} 已启动`);
}

# FAQ

#进程通信
上次更新: 2021/12/19, 18:05:42
说说nodejs中的事件循环机制理解
说说nodejs中间件是什么,如何封装一个中间件

← 说说nodejs中的事件循环机制理解 说说nodejs中间件是什么,如何封装一个中间件→

最近更新
01
多分支修复撞车的问题
05-01
02
如何成为架构师
01-23
03
服务器部署全过程
11-23
更多文章>
Theme by Vdoing | Copyright © 2019-2026 fangdown | 粤ICP备19079809号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式