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

这篇文章主要介绍了浅谈node.js 子进程与应用场景,现在分享给大家,也给大家做个参考。

背景

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

在使用的过程中碰到的坑

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

几种解决方案

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

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

子进程种类

spawn:执行命令

exec:执行命令(新建 shell)

execFile:执行文件

fork:执行文件

子进程常用事件

exit

close

error

message

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

子进程数据流

stdin

stdout

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.jsconst { fork } = require('child_process');const child = fork('child.js');child.on('message', (msg) => {  console.log('Message from child', msg);});child.send({ hello: 'world' });

登录后复制

// child.jsprocess.on('message', (msg) => {  console.log('Message from parent:', msg);});let counter = 0;setInterval(() => {  process.send({ counter: counter++ });}, 3000);

登录后复制

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

子进程使用场景

计算密集型系统

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

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

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在vue.js中有关vue-fontawesome使用

在vue.js中有关vue-fontawesome使用

在vue.js中有关vue-fontawesome使用

在vue.js中有关vue-fontawesome使用

在vue.js中有关vue-fontawesome使用

以上就是在Node.js中子进程有哪些应用场景的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3150664.html

(0)
上一篇 2025年3月30日 08:52:51
下一篇 2025年3月13日 10:22:33

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 利用node.js等技术如何实现登录注册功能?

    这篇文章主要介绍了node.js+express+mysql+ejs+bootstrop实现网站登录注册功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下 同志们,经过不懈的努力,查了各种文档,终于鼓捣出了一个稍微像样一点的node项目…

    2025年3月30日
    100
  • 使用mock.js生成随机数据

    这篇文章主要介绍了使用mock.js随机数据和使用express输出json接口的实现方法,需要的朋友可以参考下 前端项目都会用到后端的接口,但当后台接口没有写好的时候,这时候可以用mock.js先随机生成一些假数据来调试页面 安装mock…

    2025年3月30日
    100
  • 使用Nodejs连接mysql实现基本操作

    这篇文章主要介绍了nodejs连接mysql并实现增、删、改、查操作的方法,结合实例形式详细分析了nodejs针对mysql数据库的的连接、mysql数据库的创建及nodejs针对mysql增删改查等相关操作具体实现技巧,需要的朋友可以参考…

    2025年3月30日 编程技术
    100
  • 如何使用node模块与npm包管理工具

    这篇文章主要介绍了node模块与npm包管理工具,现在分享给大家,也给大家做个参考。 在Node.js中,以模块为单位划分所有的功能,并且提供了一个完整的模块加载机制,所以我们可以将应用程序划分为各个不同的部分,并且对这些部分进行很好的协同…

    2025年3月30日 编程技术
    100
  • 使用vue如何引入ueditor及node后台配置

    这篇文章主要介绍了vue引入ueditor及node后台配置详解,现在分享给大家,也给大家做个参考。 最近公司的某个客户要用上我们公司的产品,他的后台管理里的富文本编辑器要求有点多,开始打算用Quill,但是发现Quill根本满足不了他的需…

    编程技术 2025年3月30日
    100
  • 在Node.js中如何搭建小程序后台服务

    最近在做微信的应用号小程序开发,小程序的后台数据接口需要https安全请求,所以需要我的nodejs服务器能够提供https的支持,现在就将整个https服务器的搭建过程说一下 准备条件 一台服务器 SSL证书,小程序规定必须要https协…

    编程技术 2025年3月30日
    100
  • 使用nodejs如何操作mongodb的填删改查模块

    下面我就为大家分享一篇nodejs操作mongodb的填删改查模块的制作及引入实例,具有很好的参考价值,希望对大家有所帮助。 安装相关模块 如果使用这个的话,你需要先自己安装一下他需要的模块,在根目录输入 npm install mongo…

    编程技术 2025年3月30日
    100
  • 在nodejs中如何实现OAuth2.0授权服务认证

    本篇文章主要介绍了nodejs实现oauth2.0授权服务认证,现在分享给大家,也给大家做个参考。 OAuth是一种开发授权的网络标准,全拼为open authorization,即开放式授权,最新的协议版本是2.0。 举个栗子: 有一个&…

    2025年3月30日 编程技术
    100
  • nodejs+express做出文件上传

    这次给大家带来nodejs+express做出文件上传,nodejs+express做出文件上传的注意事项有哪些,下面就是实战案例,一起来看一下。 本文实例讲述了nodejs基于express实现文件上传的方法。分享给大家供大家参考,具体如…

    编程技术 2025年3月30日
    100
  • 怎么用Forever和nginx部署Node站点

    线程持久运行 一般来说,我们在window cmd上通过node index.js启动一个服务器,只要不关闭,就可以一直访问和调用接口。但是在linux上往往如果长时间不操作或者你要执行其他操作时候,你的node服务就会断开,用户也不能访问…

    2025年3月30日
    100

发表回复

登录后才能评论