iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >Node.js中子进程与应用场景有哪些
  • 822
分享到

Node.js中子进程与应用场景有哪些

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

这篇文章主要介绍了node.js中子进程与应用场景有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。背景由于ons基于 C艹 封装而来,不

这篇文章主要介绍了node.js中子进程与应用场景有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

背景

由于ons基于 C艹 封装而来,不支持单一进程内实例化多个生产者与消费者,为了解决这一问题,使用了 node.js 子进程。

在使用的过程中碰到的坑

发布:进程管理关闭主进程后,子进程变为操作系统进程(pid 为 1)

几种解决方案

将子进程看做独立运行的进程,记录 pid,发布时进程管理关闭主进程同时关闭子进程

主进程监听关闭事件,主动关闭从属于自己的子进程

子进程种类

  1. spawn:执行命令

  2. exec:执行命令(新建 shell

  3. execFile:执行文件

  4. fork:执行文件

子进程常用事件

  1. exit

  2. close

  3. error

  4. message

close 与 exit 是有区别的,close 是在数据流关闭时触发的事件,exit 是在子进程退出时触发的事件。因为多个子进程可以共享同一个数据流,所以当某个子进程 exit 时不一定会触发 close 事件,因为这个时候还存在其他子进程在使用数据流。

子进程数据流

  1. stdin

  2. stdout

  3. stderr

因为是以主进程为出发点,所以子进程的数据流与常规理解的数据流方向相反,stdin:写入流,stdout、stderr:读取流。

spawn

spawn(command[, args][, options])

执行一条命令,通过 data 数据流返回各种执行结果。

基础使用

const { spawn } = require('child_process');

const child = spawn('find', [ '.', '-type', 'f' ]);
child.stdout.on('data', (data) => {
  console.log(`child stdout:\n${data}`);
});

child.stderr.on('data', (data) => {
  console.error(`child stderr:\n${data}`);
});

child.on('exit', (code, signal) => {
  console.log(`child process exit with: code $[code], signal: ${signal}`);
});

常用参数

{
  cwd: String,
  env: Object,
  stdio: Array | String,
  detached: Boolean,
  shell: Boolean,
  uid: Number,
  gid: Number
}

重点说明下 detached 属性,detached 设置为 true 是为子进程独立运行做准备。子进程的具体行为与操作系统相关,不同系统表现不同,windows 系统子进程会拥有自己的控制台窗口,POSIX 系统子进程会成为新进程组与会话负责人。

这个时候子进程还没有完全独立,子进程的运行结果会展示在主进程设置的数据流上,并且主进程退出会影响子进程运行。当 stdio 设置为 ignore 并调用 child.unref(); 子进程开始真正独立运行,主进程可独立退出。

exec

exec(command[, options][, callback])

执行一条命令,通过回调参数返回结果,指令未执行完时会缓存部分结果到系统内存。

const { exec } = require('child_process');

exec('find . -type f | wc -l', (err, stdout, stderr) => {
  if (err) {
    console.error(`exec error: ${err}`);
    return;
  }

  console.log(`Number of files ${stdout}`);
});

两全其美 —— spawn 代替 exec

由于 exec 的结果是一次性返回,在返回前是缓存在内存中的,所以在执行的 shell 命令输出过大时,使用 exec 执行命令的方式就无法按期望完成我们的工作,这个时候可以使用 spawn 代替 exec 执行 shell 命令。

const { spawn } = require('child_process');

const child = spawn('find . -type f | wc -l', {
  stdio: 'inherit',
  shell: true
});

child.stdout.on('data', (data) => {
  console.log(`child stdout:\n${data}`);
});

child.stderr.on('data', (data) => {
  console.error(`child stderr:\n${data}`);
});

child.on('exit', (code, signal) => {
  console.log(`child process exit with: code $[code], signal: ${signal}`);
});

execFile

child_process.execFile(file[, args][, options][, callback])

执行一个文件

与 exec 功能基本相同,不同之处在于执行给定路径的一个脚本文件,并且是直接创建一个新的进程,而不是创建一个 shell 环境再去运行脚本,相对更轻量级更高效。但是在 Windows 系统中如 .cmd 、 .bat 等文件无法直接运行,这是 execFile 就无法工作,可以使用 spawn、exec 代替。

fork

child_process.fork(modulePath[, args][, options])

执行一个 Node.js 文件

// parent.js

const { fork } = require('child_process');

const child = fork('child.js');

child.on('message', (msg) => {
  console.log('Message from child', msg);
});

child.send({ hello: 'world' });
// child.js

process.on('message', (msg) => {
  console.log('Message from parent:', msg);
});

let counter = 0;

setInterval(() => {
  process.send({ counter: counter++ });
}, 3000);

fork 实际是 spawn 的一种特殊形式,固定 spawn Node.js 进程,并且在主子进程间建立了通信通道,让主子进程可以使用 process 模块基于事件进行通信。

子进程使用场景

  1. 计算密集型系统

  2. 前端构建工具利用多核 CPU 并行计算,提升构建效率

  3. 进程管理工具,如:PM2 中部分功能

感谢你能够认真阅读完这篇文章,希望小编分享的“Node.js中子进程与应用场景有哪些”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网node.js频道,更多相关知识等着你来学习!

--结束END--

本文标题: Node.js中子进程与应用场景有哪些

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

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

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

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

下载Word文档
猜你喜欢
  • Node.js中子进程与应用场景有哪些
    这篇文章主要介绍了Node.js中子进程与应用场景有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。背景由于ons基于 C艹 封装而来,不...
    99+
    2024-04-02
  • node.js的应用场景有哪些
    Node.js的应用场景包括但不限于以下几个方面:1. 服务器端应用程序开发:Node.js是一种基于事件驱动的语言,非常适合构建高...
    99+
    2023-08-31
    node.js
  • node.js中有哪些适用场景
    这篇文章主要介绍了node.js中有哪些适用场景,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 node.js是...
    99+
    2024-04-02
  • Redis中有哪些应用场景
    本篇内容介绍了“Redis中有哪些应用场景”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Redis数据类型...
    99+
    2024-04-02
  • html5有哪些应用场景
    今天小编给大家分享一下html5有哪些应用场景的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2024-04-02
  • Redis有哪些应用场景
    这篇文章主要介绍了Redis有哪些应用场景,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Redis 有哪些应用场景缓存:这应该是 Redis...
    99+
    2024-04-02
  • redis应用场景有哪些
    这篇文章主要介绍了redis应用场景有哪些,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。redis用在什么地方?redis应用场景● 令牌(To...
    99+
    2024-04-02
  • golang应用场景有哪些
    golang应用场景有网络编程、分布式系统、微服务、大数据处理、Web开发、云计算和容器化、物联网等等。详细介绍:1、网络编程,Golang具有内置的网络编程库,可以方便地构建高性能的网络应用程序;2、分布式系统,Golang天生支持并发和...
    99+
    2023-12-14
    Golang
  • Python多进程与多线程的使用场景有哪些
    这篇文章主要介绍Python多进程与多线程的使用场景有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言Python多进程适用的场景:计算密集型(CPU密集型)任务Python多线程适用的场景:IO密集型任务计算...
    99+
    2023-06-07
  • java多线程应用场景有哪些
    Java多线程的应用场景有以下几种:1. 任务并行:当一个任务可以被分解为多个独立的子任务,并且这些子任务可以并行执行时,可以使用多...
    99+
    2023-09-13
    java
  • spark中submit的应用场景有哪些
    在Spark中,submit方法通常用于将作业提交给Spark集群执行。以下是一些submit方法的应用场景: 执行批处理作业:...
    99+
    2024-04-03
    spark submit
  • java中lamda的应用场景有哪些
    集合操作:使用lamda表达式可以简化集合的遍历和操作,比如筛选、排序、映射等。 线程处理:使用lamda表达式可以方便地创...
    99+
    2024-03-11
    java
  • mysql中connection的应用场景有哪些
    在Web开发中,连接到数据库以执行查询和更新操作。 在服务器应用程序中,连接到数据库以处理用户请求并返回数据。 在数据分...
    99+
    2024-04-02
  • java中aop的应用场景有哪些
    Java中AOP(面向切面编程)的应用场景包括:1. 日志记录:可以通过AOP将日志记录代码横切到各个业务方法中,实现统一的日志记录...
    99+
    2023-10-11
    java
  • Java中attribute的应用场景有哪些
    在Java中,attribute(属性)可以用来描述一个对象的特征、状态或者行为。以下是一些常见的Java中attribute的应用...
    99+
    2023-10-18
    Java
  • java中method的应用场景有哪些
    封装代码逻辑:将一系列相关的代码封装到一个方法中,可以提高代码的可读性和可维护性。 提高代码的重用性:定义一个方法后,可以在...
    99+
    2024-03-12
    java
  • sql中decode的应用场景有哪些
    在SQL中,DECODE函数通常用于根据条件返回不同的值。以下是DECODE函数的一些常见应用场景: 将某个字段的值映射为另一个...
    99+
    2024-04-09
    sql
  • tensorflow中sum的应用场景有哪些
    在TensorFlow中,sum的应用场景有: 计算张量的元素之和:可以使用tf.reduce_sum函数计算张量中所有元素的和...
    99+
    2024-04-02
  • redis的场景应用有哪些
    这篇文章主要介绍“redis的场景应用有哪些”,在日常操作中,相信很多人在redis的场景应用有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”redis的场景应用有哪些”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-04
  • clickhouse的应用场景有哪些
    ClickHouse 是一个用于实时数据分析的列式数据库管理系统,主要应用于以下场景: 实时数据分析:ClickHouse 可以...
    99+
    2024-03-01
    clickhouse
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作