iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Node.js进程管理之子进程实例分析
  • 939
分享到

Node.js进程管理之子进程实例分析

2023-07-02 15:07:54 939人浏览 薄情痞子
摘要

这篇“node.js进程管理之子进程实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“node.js进程管理之子进程实例

这篇“node.js进程管理之子进程实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“node.js进程管理之子进程实例分析”文章吧。

一、理论

Node.js是单线程的,对于现在普遍是多处理器的机器是一种浪费,怎么能利用起来呢?于是child_process模块出现了。child_process模块可以在其他进程上产生、派生,并执行工作。

child_process模块提供了一个ChildProcess的新类,它可以作为从父进程访问子进程的表示形式。Process模块也是ChildProcess对象。当你从父模块访问process时,它是父ChildProcess对象,当你从子进程访问Process是,它是ChildProcess对象

了解一个对象无外乎事件、方法、属性。ChildProcess也是一样。下面列出一些常用的事件、方法和属性。

事件:

message:当ChildProcess对象调用send()方法来发送数据时触发。

error:在工作进程中出现错误时发出。该处理程序接收一个错误对象作为唯一的参数。

exit:当工作进程结束时发出。该处理程序接收两个参数,code,signal.

close:当工作进程的所有stdio流都已经终止的时候发出。与exit不同的是,因为多个进程可以共享相同的stdio流。

disconnect:当disconnect()在一个工作进程上被调用时发出。

方法:

kill([signal]):导致操作系统发送一个kill信号给子进程。默认是SIGTERM.

send(message,[sendHandle]):将消息发送到句柄。消息可是字符串或对象。sendhandle可以把tcp Server或Socket对象发送到客户端。这允许客户端进程共享相同的端口和地址。

disconnect():关闭父进程与子进程之间的进程通信(或IPC)通道,并把父进程和子进程的连接标志都设置为false。

属性:

stdin:输入Writable流。

stdout:标准输出Readable流。

strerr:用于输出错误的标准输出Readable流。

pid:进程的ID。

connected:一个布尔值。在disconnect()被调用后,它被设置为false,当是false时,就不能将消息发送给子进程。

二、实践

1.exec()在另一进程执行一个系统命令

exec()函数在一个子shell中执行系统命令。几乎可以执行能从控制台提示符下执行的任何东西,如二进制可执行文件、shell脚本、python脚本或批处理文件。

exec(command,[options],callback)函数返回一个ChildProcess对象

command:字符串,指定在子shell中执行的命令。

options:对象,指定执行命令时使用的设置。选项如下:

  • cwd:指定子进程执行的当前工作目录

  • env:一个对象,指定property:value作为环境的键/值对

  • encoding:指定存储命令的输出时输出缓冲区使用的编码

  • maxBuffer:指定stdout、stderror输出缓冲区的大小。默认200*1024.

  • timeout:指定父进程在杀掉子进程之前,如果子进程未完成等待的毫秒数。默认0

  • killSignal:指定终止子进程时使用的kill信号。默认SIGTERM。

callback:接收error、stdout、stderr3个参数。

var childProcess = require('child_process');var options = {maxBuffer:100*1024, encoding:'utf8', timeout:5000};var child = childProcess.exec('dir /B', options,                               function (error, stdout, stderr) {  if (error) {    console.log(error.stack);    console.log('Error Code: '+error.code);    console.log('Error Signal: '+error.signal);  }  console.log('Results: \n' + stdout);  if (stderr.length){    console.log('Errors: ' + stderr);  }});child.on('exit', function (code) {  console.log('Completed with code: '+code);});

输出结果:

"C:\Program Files (x86)\JetBrains\WEBStORM 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe child_process_exec.jsCompleted with code: 0Results: chef.jschild_fork.jschild_process_exec.jschild_process_exec_file.jschild_process_spawn.jscluster_client.jscluster_server.jscluster_worker.jsfile.txtprocess_info.jsProcess finished with exit code 0

2.execFile()在另一个进程上执行一个可执行文件

它与exec()相似,不同的是execFile()没有使用子shell,执行的命令必须是一个二进制可执行文件linux的shell脚本和windows的批处理文件不能使用ecexFile().

execFile(file,args,options,callback)也是返回一个ChildProcess。

file:字符串,执行要执行的可执行文件的路径。

args:数组,指定传递给可执行文件的命令行参数。

options:参考exec()的。

callback:参考exec().

var childProcess = require('child_process');var options = {maxBuffer:100*1024, encoding:'UTF-16', timeout:5000};var child = childProcess.execFile('ping.exe', ['-n', '1', 'baidu.com'],                                  options, function (error, stdout, stderr) {  if (error) {    console.log(error.stack);    console.log('Error Code: '+error.code);    console.log('Error Signal: '+error.signal);  }  console.log('Results: \n' + stdout.toString());  if (stderr.length){    console.log('Errors: ' + stderr.toString());  }});child.on('exit', function (code) {  console.log('Child completed with code: '+code);});

3.spawn()在另一个Node.js实例中产生一个进程

spawn(cmd,[args],[options])函数产生一个进程,连接它们之间的stdio、stdout、stderr的管道,然后在新的线程中使用spawn()执行文件。它和上面两个的主要区别是产生的进程中的stdin可以进行配置,并且stdout、stderr都是父进程中的Readable流。这意味着exec()、execFile()必须先执行完成,才能读取缓冲区输出,但一旦一个spawn()进程的输出数据已被写入就可以读取它(这个可以从它们3个的输出结果的顺序可以看出,上面两个都是先执行exit事件,而spawn()exit处理是在后面)。

cmd、args和上面两个的一样。options也可以设置cwd、env,还可以设置detached、stdio。

detached:布尔值,true时使子进程成为新进程组的组长,即使父进程退出,也会继续,可以使用child_unref()使得父进程退出之前不等待子进程

stdio:定义子进程stdio配置([stdin,stdout,stderr]).默认[0,1,2].此字符串定义每个输入输出流的配置。

var spawn = require('child_process').spawn;var options = {    env: {user:'brad'},    detached:false,    stdio: ['pipe','pipe','pipe']};var child = spawn('netstat', ['-e']);child.stdout.on('data', function(data) {  console.log(data.toString());});child.stderr.on('data', function(data) {  console.log(data.toString());});child.on('exit', function(code) {  console.log('Child exited with code', code);});

4.实现子派生

Node.js提供了另外一种进程产生方式——派生。它主要是执行在一个单独的处理器上运行另外一个V8引擎实例中的Node.js模块代码。可以用派生来并行运行多个服务。不过这需要时间来运转V8的一个新实例,每个实例需要大约10M的内存,所以应该把派生的进程设计为存活期更长的,不需要大量派生的进程。与spawn不同的是,它不能为子进程配置stdio。可以使用ChildProcess对象中的send()机制在父进程与子进程间通信。

fork(modulePath,[args],[options])对象也是返回一个ChildProcess对象。

modulePath:字符串,指定被新的Node.js实例启动的javascript文件路径。

args:数组,指定传递给node命令的命令行参数。

options:参数对象,指定执行命令时使用的设置。

cwd、env上面有。

encoding:指定数据写入输出流时和穿越send()IPC机制时使用的编码

execPath:指定用于创建产生Node.js进程的可执行文件。

silent:一个布尔值,true时将导致派生的进程中的stdout和stderr不与父进程相关联,默认false。

Child.send()父进程向子进程发送消息,Process.send()是子进程向父进程发送消息。

var child_process = require('child_process');var options = {    env:{user:'Brad'},    encoding:'utf8'};function makeChild(){  var child = child_process.fork('chef.js', [], options);  child.on('message', function(message) {    console.log('Served: ' + message);  });  return child;}function sendCommand(child, command){  console.log("Requesting: " + command);  child.send({cmd:command});}var child1 = makeChild();var child2 = makeChild();var child3 = makeChild();sendCommand(child1, "makeBreakfast");sendCommand(child2, "makeLunch");sendCommand(child3, "makeDinner");
process.on('message', function(message, parent) {  var meal = {};  switch (message.cmd){    case 'makeBreakfast':      meal = ["ham", "eggs", "toast"];      break;    case 'makeLunch':      meal = ["burger", "fries", "shake"];      break;    case 'makeDinner':      meal = ["soup", "salad", "steak"];      break;  }  process.send(meal);});

输出结果:

"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe child_fork.jsRequesting: makeBreakfastRequesting: makeLunchRequesting: makeDinnerServed: ham,eggs,toastServed: burger,fries,shakeServed: soup,salad,steak

上面的代码是在主进程中创建3个子进程,父进程给子进程发消息,子进程接收并给父进程发消息。

以上就是关于“Node.js进程管理之子进程实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Node.js进程管理之子进程实例分析

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

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

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

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

下载Word文档
猜你喜欢
  • Node.js进程管理之子进程实例分析
    这篇“Node.js进程管理之子进程实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node.js进程管理之子进程实例...
    99+
    2023-07-02
  • Node.js进程管理之子进程详解
    一、理论 之前看多进程这一章节时发现这块东西挺多,写Process模块的时候也有提到,今天下午午休醒来静下心来好好的看了一遍,发现也不是太难理解。 Node.js是单线程的,对于现在...
    99+
    2022-11-13
  • Node中的进程与子进程实例代码分析
    本篇内容主要讲解“Node中的进程与子进程实例代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node中的进程与子进程实例代码分析”吧!进程:proces...
    99+
    2022-10-19
  • Node.js进程管理之进程集群详解
    一、cluster模块 Node.js是单线程处理,对于高并发的请求怎么样能增加吞吐量呢?为了提高服务器的利用率,能不能多核的来处理呢?于是就有了cluster模块。 cluster...
    99+
    2022-11-13
  • Node.js中的多进程和多线程实例分析
    本篇内容主要讲解“Node.js中的多进程和多线程实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中的多进程和多线程实例分析”吧!我们都知道...
    99+
    2022-10-19
  • NodeJS中父进程与子进程资源共享原理的示例分析
    小编给大家分享一下NodeJS中父进程与子进程资源共享原理的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!实验目标:实现父进程与子进程间资源共享使用模块:cluster简介:建立n...
    99+
    2022-10-19
  • Node.js中进程和线程的示例分析
    这篇文章给大家分享的是有关Node.js中进程和线程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。进程与线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有...
    99+
    2023-06-15
  • Python进程池与进程锁实例分析
    本篇内容主要讲解“Python进程池与进程锁实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python进程池与进程锁实例分析”吧!进程池什么是进程池上一章节关于进程的问题我们提到过,进程...
    99+
    2023-06-29
  • swoole之进程模型的示例分析
    小编给大家分享一下swoole之进程模型的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!初识server一文的时候我们说过,swoole是事件驱动的。在使...
    99+
    2023-06-14
  • Python基础之进程的示例分析
    这篇文章将为大家详细讲解有关Python基础之进程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言进程,一个新鲜的字眼,可能有些人并不了解,它是系统某个运行程序的载体,这个程序可以有单个或...
    99+
    2023-06-15
  • Node.js进程管理之Process模块详解
    在前面Node.js事件运行机制也有提到,Node.js应用在单个线程运行,但是现在大部分服务器都是多处理器,为了方便使用多个进程,Node.js提供了3个模块。Process模块提...
    99+
    2022-11-13
  • Node.js中的进程与子进程怎么处理
    这篇文章主要讲解了“Node.js中的进程与子进程怎么处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node.js中的进程与子进程怎么处理”吧!进程:process模块process 模...
    99+
    2023-07-04
  • Node.js中多进程模型的示例分析
    这篇文章将为大家详细讲解有关Node.js中多进程模型的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Cluster 模块Node.js 提供了 Cluster ...
    99+
    2022-10-19
  • nodejs基础之多进程的示例分析
    小编给大家分享一下nodejs基础之多进程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:Node.js 多进...
    99+
    2022-10-19
  • Python的进程,线程和协程实例分析
    这篇“Python的进程,线程和协程实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python的进程,线程和协程实例...
    99+
    2023-06-29
  • Linux的shell与进程实例分析
    这篇“Linux的shell与进程实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux的shell与进程实例分析...
    99+
    2023-06-28
  • linux下的守护进程实例分析
    本篇内容主要讲解“linux下的守护进程实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux下的守护进程实例分析”吧!shell控制的php常驻进程...
    99+
    2022-10-19
  • Linux之进程管理(3)作业管理
    Linux之进程管理(3)作业管理Linux的作业控制介绍:前台作业:通过终端启动,且启动后一直占据终端;后台作业:可通过终端启动,但启动后转入后台运行(释放终端);让进程作业运行在后台:1、对运行中的进程:使用Ctrl+z2、尚未启动的作...
    99+
    2023-01-31
    作业 进程 Linux
  • python清理子进程机制剖析
    起步 在我的印象中,python的机制会自动清理已经完成任务的子进程的。通过网友的提问,还真看到了僵尸进程。 import multiprocessing as mp import os import ...
    99+
    2022-06-04
    进程 机制 python
  • Javaweb进程与线程的示例分析
    这篇文章将为大家详细讲解有关Javaweb进程与线程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、认识进程1,线程初识一个可执行程序运行起来,就可以看作是一个进程进程也是操作系统分配资源的最...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作