首页 > 编程语言 >无涯教程-Node.js - 扩展程序

无涯教程-Node.js - 扩展程序

时间:2024-01-21 19:35:21浏览次数:18  
标签:Node executed process Child 无涯 js master child

Node.js以单线程模式运行,但是它使用事件驱动来处理并发,它还有助于创建子进程,以在基于多核CPU的系统上利用并行处理。

子进程始终具有三个流 child.stdin , child.stdout 和 child.stderr ,它们可以与父级的stdio流共享处理。

Node提供了 child_process 模块,该模块具有以下三种创建子进程的主要方法。

  • exec      -   child_process.exec 方法在shell /控制台中运行命令并缓冲输出。

  • spawn  -  child_process.spawn 使用给定命令启动新进程。

  • fork      -  child_process.fork 方法是spawn()创建子进程的特殊情况。

exec()方法

child_process.exec方法在Shell中运行命令并缓冲输出。它具有以下参数-

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

这是使用的参数的描述-

  • command(String)                  - 运行的命令,带有以空格分隔的参数

  • options(Object)可以包含以下一个或多个选项-

    • cwd (String)                   -  子进程的当前工作目录

    • env (Object)                   - 环境键值对

    • encoding(String)          - 默认值:'utf8'

    • shell (String)                 - 用于使用以下命令执行命令的Shell

    • timeout(Number)        - 默认值:0

    • maxBuffer (Number)  - 默认值:200 * 1024

    • killSignal (String)        - 默认值:'SIGTERM'

    • uid (Number)               - 设置进程的用户身份。

    • gid (Number)               - 设置进程的组标识。

  • 回调该函数获取三个参数 error , stdout,和 stderr 进程终止时的输出。

exec()方法返回一个最大大小的缓冲区,等待进程结束,并尝试一次返回所有缓冲的数据。

让无涯教程创建两个名为support.js和master.js的js文件-

文件:support.js

console.log("Child Process " + process.argv[2] + " executed." );

文件:master.js

const fs=require('fs');
const child_process=require('child_process');

for(var i=0; i<3; i++) {
   var workerProcess=child_process.exec('node support.js '+i,function 
      (error, stdout, stderr) {
      
      if (error) {
         console.log(error.stack);
         console.log('Error code: '+error.code);
         console.log('Signal received: '+error.signal);
      }
      console.log('stdout: ' + stdout);
      console.log('stderr: ' + stderr);
   });

   workerProcess.on('exit', function (code) {
      console.log('Child process exited with exit code '+code);
   });
}

现在运行master.is以查看输出-

$node master.js

验证输出。服务器已启动。

Child process exited with exit code 0
stdout: Child Process 1 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 0 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 2 executed.

spawn()方法

child_process.spawn方法使用给定命令启动新进程。它具有以下参数-

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

这是使用的参数的描述-

  • command(String) 要运行的命令

  • args (Array) 字符串参数列表

  • options(Object )可以包含以下一个或多个选项-

    • cwd (String)              - 子进程的当前工作目录。

    • env (Object)              - 环境键值对。

    • stdio (Array)             - 字符串子级的stdio配置。

    • customFds (Array)  - 不推荐使用的子描述符,供子代用于stdio。

    • detached(Boolean)  - 该子级将成为流程组负责人。

    • uid (Number)           - 设置进程的用户身份。

    • gid (Number)           - 设置进程的组标识。

spawn()方法返回流(stdout&stderr),当进程返回大量数据时应使用它。 一旦进程开始执行,spawn()就开始接收响应。

创建两个名为support.js和master.js的js文件-

文件:support.js

console.log("Child Process " + process.argv[2] + " executed." );

文件:master.js

const fs=require('fs');
const child_process=require('child_process');
 
for(var i=0; i<3; i++) {
   var workerProcess=child_process.spawn('node', ['support.js', i]);

   workerProcess.stdout.on('data', function (data) {
      console.log('stdout: ' + data);
   });

   workerProcess.stderr.on('data', function (data) {
      console.log('stderr: ' + data);
   });

   workerProcess.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

现在运行master.is以查看输出-

$node master.js

验证输出。服务器已启动

stdout: Child Process 0 executed.

child process exited with code 0
stdout: Child Process 1 executed.

stdout: Child Process 2 executed.

child process exited with code 0
child process exited with code 0

fork()方法

child_process.fork方法是spawn()创建Node进程的示例。它具有以下参数-

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

这是使用的参数的描述-

  • modulePath (String)要在子代中运行的模块。

  • args (Array)字符串参数列表

  • options(Object )            - 可以包含以下一个或多个选项-

    • cwd (String)          - 子进程的当前工作目录。

    • env (Object)          - 环境键值对。

    • execPath (String) - 用于创建子进程的可执行文件。

    • execArgv (Array) - 传递给可执行文件的字符串参数列表(默认值:process.execArgv)。

    • silent (Boolean)   -  如果为true,则将孩子的stdin,stdout和stderr通过管道传递给父级,否则它们将从父级继承,默认为false。

    • uid (Number)       - 设置进程的用户身份。

    • gid (Number)       - 设置进程的组标识。

fork方法除了将所有方法都包含在常规ChildProcess中之外,还返回带有内置通信通道的对象 。

创建两个名为support.js和master.js的js文件-

文件:support.js

console.log("Child Process " + process.argv[2] + " executed." );

文件:master.js

const fs=require('fs');
const child_process=require('child_process');
 
for(var i=0; i<3; i++) {
   var worker_process=child_process.fork("support.js", [i]);	

   worker_process.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

现在运行master.is以查看输出-

$node master.js

验证输出。服务器已启动。

Child Process 0 executed.
Child Process 1 executed.
Child Process 2 executed.
child process exited with code 0
child process exited with code 0
child process exited with code 0

参考链接

https://www.learnfk.com/nodejs/nodejs-scaling-application.html

标签:Node,executed,process,Child,无涯,js,master,child
From: https://blog.51cto.com/u_14033984/9355571

相关文章

  • 无涯教程-Node.js - Request Object函数
    req对象代表HTTP请求,并具有请求查询字符串,参数,正文,HTTP标头等的属性。RequestObject属性以下是与请求对象关联的一些属性的列表。Sr.No.Properties&描述1req.app此属性保存对使用中间件的快速应用程序实例的引用。2req.baseUrl的安装路由器实例的URL路径。......
  • 无涯教程-Node.js - Response Object函数
    res对象表示Express应用程序在收到HTTP请求时发送的HTTP响应。响应对象属性以下是与响应对象关联的一些属性的列表。Sr.No.Properties&描述1res.app此属性保存对使用中间件的快速应用程序的引用。2res.headers已发送布尔值属性,指示应用程序是否为响应发送了H......
  • Github图床搭建,结合Picgo与jsdelivr的免费cdn加速,以及部分问题解决方案
    留份文档,便于后续查询===================用到的地址:Github:GitHubPicgo:PicGoisHere|PicGojsdelivr加速地址:https://cdn.jsdelivr.net/gh/Github用户名/仓库名@master===================1.创建一个GitHub仓库:进入你的GitHub首页,在右上角你会找到一个➕,在下拉菜单中......
  • 无涯教程-Node.js - RESTFul API
    REST是基于Web标准的体系结构,并使用HTTP协议,它围绕资源展开,其中每个组件都是资源,并且使用HTTP标准方法通过公共接口访问资源。REST由RoyFielding于2000年首次提出。HTTP方法在基于REST的体系结构中,通常使用以下四种HTTP方法。GET     -用于提供对资源的只读访问......
  • 前端js方法的书写顺序,比如有内部方法,外部方法,用户触发的动作方法,监听事件方法,等等,
    在前端JS开发中,通常的方法书写顺序如下:变量声明和初始化内部方法定义外部方法定义初始化函数事件监听方法定义用户触发的动作方法定义这个顺序的主要目的是提高代码的可读性和可维护性。按照这个顺序,可以使代码更加清晰、易于理解和修改。变量声明和初始化应该在前面,因为......
  • 50csv表格转换为json文件
     importcsvimportjson#常规csv表格转换为json文件,表头作为字典key字段。defconvert_csv_to_json(csv_file_path,json_file_path):data=[]withopen(csv_file_path,'r',encoding='utf-8-sig')ascsv_file:csv_reader=csv.DictReader(cs......
  • 无涯教程-Node.js - 全局对象
    Node.js全局对象本质上是全局的,并且在所有模块中都可用,无涯教程不需要在应用程序中包含这些对象,而是可以直接使用它们。__filename__filename表示正在执行的代码的文件名,这是此代码文件的解析绝对路径,对于主程序,此文件名不必与命令行中使用的文件名相同,模块内部的值是该模......
  • 无涯教程-Node.js - Web模块
    Web服务器是一个软件应用程序,它处理HTTP客户端(例如Web浏览器)发送的HTTP请求,并返回网页以响应客户端,Web服务器通常提供html文档以及图像,样式表和脚本。Web应用架构Web应用程序通常分为四层-Client         -该层由Web浏览器,移动浏览器或可以向Web服务器......
  • Java将json字符串转换为数组的方法
    Java将json字符串转换为数组的方法在Java开发中,经常会遇到将json字符串转换为数组的需求。JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,常用于前后端数据传输和存储。而Java中的JSONArray类可以用来处理json数组。下面将介绍一种常用的方法,用于将json字符串转换为......
  • 无涯教程-Node.js - 事件发送
    Node中的许多对象都会发出事件,例如net.Server每次对等点连接到它时都会发出一个事件,而fs.readStream在文件打开时会发出一个事件。发出事件的所有对象都是events.EventEmitter的实例。EventEmitter类如上一节所述,EventEmitter类位于事件模块中。可通过以下代码访问-//导入事件......