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 字符串是要运行的命令,用空格分隔的参数

  • options 对象可包括以下一个或多个选项:

    • cwd 子进程的字符串当前工作目录

    • env 对象环境的键值对

    • encoding 字符串(缺省:“UTF8”)

    • shell 字符串执行(默认命令:在UNIX上为 '/bin/sh',在Windows为cmd.exe“, 在shell应该明白/s /c 在Windows或 -c 在UNIX/;在Windows中,命令行解析应与cmd.exe兼容)

    • timeout 数字(默认: 0)

    • maxBuffer 数字(默认: 200*1024)

    • killSignal 字符串 (默认: 'SIGTERM')

    • uid 数字用于设置过程的用户的身份

    • gid 数字设置进程的组标识

  • callback 函数获取三个参数错误,输出和错误被称为与下面的输出,当进程终止。

在exec()方法返回一个缓冲带最大尺寸,等待结束该进程,并尝试一次返回所有缓存数据。

例子

让我们创建两个JS文件名分别为:support.js和master.js:

File: support.js

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

File: 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.js看到结果:

$ 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 字符串运行的命令

  • args 字符串参数数组列表

  • options 对象可包括以下一个或多个选项:

    • cwd 子进程的字符串为当前工作目录

    • env 对象环境的键值对

    • stdio 数组|子串的标准输入输出配置

    • customFds 数组,不推荐使用文件描述符的子数组,使用作为标准输入输出

    • detached 布尔将是一个子进程组

    • uid 数目设置进程的用户的身份。

    • gid 数目设置进程的组标识。

spawn()方法返回流(标准输出与标准错误),它当处理返回大量的数据被使用。spawn()开始接收到响应的进程开始执行。

例子

创建两个JS文件名分别为support.js和master.js:

File: support.js

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

File: 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.js看到的结果:

$ 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()来创建节点的过程的一个特例。它具有以下签名

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

参数

下面是使用的参数的说明:

  • modulePath 字符串 - 该模块在运行子进程

  • args 字符串 - 参数数组列表

  • options 对象可包括以下一个或多个选项:

    • cwd 字符串 - 子进程的当前工作目录

    • env 对象环境的键值对

    • execPath 字符串 - 可执行用于创建子进程

    • execArgv 传递给可执行字符串参数数组列表(默认值:process.execArgv)

    • silent Boolean - 如果为true,标准输入,stdout和子标准错误将通过管道输送到父进程,否则会从父继承,看到“pipe”和“inherit”选项spawn()更多细节标准输入输出(默认为false)

    • uid 数字 - 设置进程的用户的身份。

    • gid 数字 - 设置进程的组标识。

fork 方法返回与对象内置除了具有在正常ChildProcess实例的所有方法的通信信道。

例子

创建两个JS文件名为support.js和master.js:

File: support.js

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

File: 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.js看到的结果:

$ 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
 

标签:Node    js    规范化    应用

本站文章除注明转载外,均为本站原创或编译
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创优秀实例教程
转载请注明:文章转载自:易百教程 [http:/www.yiibai.com]
本文标题:Node.js规范化应用
本文地址:http://www.yiibai.com/nodejs/nodejs_scaling_application.html

Node.js规范化应用的更多相关文章

  1. Node.js学习笔记——Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

  2. Node.js文件系统、路径的操作详解

    17173 17173 2 75 2014-12-12T05:06:00Z 2014-12-12T05:06:00Z 21 2735 15595 www.17173.com 129 36 18294 ...

  3. Node.js文件系统、路径的操作函数

    Node.js文件系统.路径的操作函数 目录 Node.js文件系统.路径的操作函数 1.读取文件readFile函数 2.写文件 3.以追加方式写文件 4.打开文件 5.读文件,读取打开的文件内容到 ...

  4. Node.js快速入门

    Node.js是什么? Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web应用程序框架. 它的最新版本是:v0.12.7(在编写本教程时的版本).Node.js在官方 ...

  5. 转:Node.js邮件发送组件- Nodemailer 1.0发布

    原文来自于http://www.infoq.com/cn/news/2014/07/node.js-nodemailer1.0-publish Nodemailer是一个简单易用的Node.js邮件发 ...

  6. 使用Node.js搭建静态资源服务器

    对于Node.js新手,搭建一个静态资源服务器是个不错的锻炼,从最简单的返回文件或错误开始,渐进增强,还可以逐步加深对http的理解.那就开始吧,让我们的双手沾满网络请求! Note: 当然在项目中如 ...

  7. 使用 Node.js 搭建一个 API 网关

    原文地址:Building an API Gateway using Node.js 外部客户端访问微服务架构中的服务时,服务端会对认证和传输有一些常见的要求.API 网关提供共享层来处理服务协议之间 ...

  8. Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

  9. Node.js Path 模块

    Node.js path 模块提供了一些用于处理文件路径的小工具,我们可以通过以下方式引入该模块: var path = require("path") 方法 序号 方法 & ...

随机推荐

  1. C:\WINDOWS\system32\drivers\etc\hosts host文件夹里面的内容是什么?

    这个文件是根据TCP/IP for Windows 的标准来工作的,它的作用是包含IP地址和Host name(主机名)的映射关系,是一个映射IP地址和Host name(主机名)的规定,规定要求每段 ...

  2. 【LeetCode】Best Time to Buy and Sell Stock

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  3. 解决IE6,IE7不能隐藏绝对定位溢出的内容

    令人蛋疼的IE,IE6/IE7下父元素有相对/绝对定位时,子元素在IE6和IE7下overflow:hidden;失效. 情况一:(在parent上增加position:relative) <s ...

  4. 规范javascript书写

    空白 缩进 换行限制 if while for do 2.  命名 常量 URL_CONFIG 变量 listLen 函数命名 调用函数  function setStyle(dom, name, v ...

  5. windows使用python调用wget批处理下载数据

    wget是linux/unix下通常使用的下载http/ftp的数据,使用非常方便,其实wget目前经过编译,也可在windows下使用.最近需要下载大量的遥感数据,使用了python写了批处理下载程 ...

  6. Eclipse配置使用web.xml

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3792664.html ...

  7. asp.net 的状态管理

    状态管理 (state management) 在Web应用程序中,一向是很重要的课题,良好的状态管理可以帮助开发人员发展出具有状态持续能力的应用程序(像是工作流程型应用程序或是电子商务应用程序),但 ...

  8. JS根据key值获取URL中的参数值,以及把URL的参数转换成json对象

    //把url的参数部分转化成json对象 parseQueryString: function (url) { var reg_url = /^[^\?]+\?([\w\W]+)$/, reg_par ...

  9. 别人走的路--uap

    首先,我先谈谈我个人的经历,我今年34岁了,做了10多年的ERP实施顾问,大学刚毕业的时候是做ERP软件开发的,后来转岗做了实施顾问.根据我的个人经验,我给你几点建议.1.既然是很大的公司,那么ERP ...

  10. 实现Android K的伪沉浸式

    在Android 5.0之后引入了MD风格,从而状态栏沉浸也成为了一种设计习惯.而停留在之Android L之前的Android系统则不能直接实现沉浸式,这里就介绍一下如何实现Android K系列的 ...