1.process是一个全局进程,你可以直接通过process变量直接访问它。

  process实现了EventEmitter接口,exit方法会在当进程退出的时候执行。因为进程退出之后将不再执行事件循环,所有只有那些没有回调函数的代码才会被执行。

在下面例子中,setTimeout里面的语句是没有办法执行到的。

1 process.on('exit', function () {
2   setTimeout(function () {
3     console.log('This will not run');
4   }, 100);
5   console.log('exit');
6 }); //结果打印出exit

2.在你接触node之后,你就会发现那些影响了主事件循环的异常会把整个node进程宕掉的。

这会是相当严重的问题,所以process提供了另外一个有用的事件uncaughtException来解决这个问题,他会把异常抓取出来供你处理。

1 process.on('uncaughtException', function (err) {
2   console.log('Caught exception: ' + err);
3 });
4 setTimeout(function () {
5   console.log('This will still run.');
6 }, 500);
7 // Intentionally cause an exception, but don't catch it.
8 nonexistentFunc();
9 console.log('This will not run.');

我们来看上面的例子,我们注册了uncaughtException事件来捕捉系统异常。执行到nonexistentFunc()时,因为该函数没有定义所以会抛出异常。

因为javascript是解释性的语言,nonexistentFunc()方法上面的语句不会被影响到,他下面的语句不会被执行。所以他的执行结果如下:

Caught exception: ReferenceError: nonexistentFunc is not defined
This will still run.

1.child_process是Node.js的一个十分重要的模块,通过它可以实现创建多进程,以利用多核计算资源。

child_process模块提供了四个创建子进程的函数,分别是spawnexecexecFilefork。其中spawn是最原始的创建子进程的函数,其他三个都是对spawn不同程度的封装。

spawn只能运行指定的程序,参数需要在列表中给出,相当于execvp系统函数,而exec可以直接运行复杂的命令。

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

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

例如要运行ls -lh /usr,使用spawn需要写成spawn('ls', ['-lh', '/usr']),而exec只需exec('ls -lh /usr')

exec的实现原理是启动了一个系统shell来解析参数,因此可以是非常复杂的命令,包括管道和重定向。

此外,exec还可以直接接受一个回调函数作为参数,回调函数有三个参数,分别是errstdout , stderr,非常方便直接使用,例如:

1 require('child_process').exec( 'ls -lh /usr' , function(err, stdout , stderr ) {
2 console.log( stdout );
3 });

如果使用spawn,则必须写成:

2.fork函数用于直接运行Node.js模块,例如fork('./child.js'),相当于spawn('node', ['./child.js'])

与默认的spawn不同的是,fork会在父进程与子进程直接建立一个IPC管道,用于父子进程之间的通信。例如

1 var n = require('child_process').fork( './child.js');
2 n. on ( 'message', function(m) {
3 console. log ( 'PARENT got message:', m);
4 });
5 n.send({ hello: 'world' });

child.js的内容

1 process. on ( 'message', function(m) {
2 console. log ( 'CHILD got message:', m);
3 });
4 process.send({ foo: 'bar' });

结果:

1 PARENT got message: { foo: 'bar' }
2 CHILD got message: { hello: 'world' }

3.fork函数有一个问题,就是它只能运行JavaScript代码,如果你喜欢用CoffeeScript(或者其他任何编译到js的语言),是无法通过fork调用的。

一个简单的方法是把代码编译到JavaScript再运行,但是很不方便,有没有什么办法呢?答案是可以的,

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

通过把options参数的stdio设为['ipc']

即可在父子进程之间建立IPC管道。例如子进程使用CoffeeScript:

1 child_process = require ('child_process');
2 options ={stdio: ['ipc'] };
3 child = child_process.spawn('coffee', ['./child.coffee'], options);

其中只要把spawn的第一个参数设置为运行对应脚本的解释器,即可运行,例如使用Continuation.js,

只需child = child_process.spawn('continuation', ['./child.coffee'], options)

参考:

http://www.cnblogs.com/yuyutianxia/p/3271733.html

[转]nodejs中的process模块--child_process.exec的更多相关文章

  1. 介绍nodejs中的path模块的几个方法

    webpack中常用的: var path = require('path') 是nodejs中的path模块,介绍一下webpack中常用的几个path模块的方法: 应用node环境的时候,这个pa ...

  2. 创建多进程之multiprocess包中的process模块

    创建多进程之multiprocess包中的process模块 1.process模块是一个创建进程的模块 Process([group [, target [, name [, args [, kwa ...

  3. nodejs中的fs模块中的方法

    nodejs中的fs模块 引入模块 const fs =require("fs") 检测文件是否存在fs.stat(path,callback) fs.stat("./n ...

  4. 使用 nodejs 中的 http 模块实现几个超实用的工具

    nodejs 方便了我们前端开发者进行一些服务端上的操作,可以进行无缝地衔接.像其他一些后端语言,如 php, golang, java 等,都需要一定的学习成本,而 nodejs 则就是为前端开发者 ...

  5. 浅析nodeJS中的Crypto模块,包括hash算法,HMAC算法,加密算法知识,SSL协议

    node.js的crypto在0.8版本,这个模块的主要功能是加密解密. node利用 OpenSSL库(https://www.openssl.org/source/)来实现它的加密技术, 这是因为 ...

  6. NodeJS中的http模块

    利用http模块,nodejs可以开发服务器, 极大简化服务器的创建: var http = require("http"); //创建服务器 var server = http. ...

  7. 60.浅谈nodejs中的Crypto模块

    转自:https://www.cnblogs.com/c-and-unity/articles/4552059.html node.js的crypto在0.8版本并没有改版多少,这个模块的主要功能是加 ...

  8. nodeJS中使用mongoose模块操作mongodb数据库

    在实际运用中,对于数据库的操作我们不可能一直在cmd命令行中进行操作,一般情况下需要在node环境中来操作mongodb数据库,这时就需要引入mongoose模块来对数据库进行增删改查等操作. 首先, ...

  9. nodejs中的Crypto模块

    我是属于实用型的选手,千万别问我过多原理性的东西,我只知道,这个是最好的,我就用它. http://cnodejs.org/topic/504061d7fef591855112bab5

随机推荐

  1. 串 2016Vijos省选集训 day3[AC自动机]

    1.串(string.c/.cpp/.pas) 限时1s,内存限制256MB,20个测试点 [题目描述] 兔子们在玩字符串的游戏.首先,它们拿出了一个字符串集合S,然后它们定义一个字符串为“好”的,当 ...

  2. 新升级!EasyNVR3.0功能概述--直播与录像

    背景介绍: 对于摄像机直播已经是我们司空见惯的需求,但是,许多用户在现有的直播的基础上更有录像的需求,并且有关于录像的删除定时等录像计划的需求,更有客户不仅需要这些功能,还需要将这些功能集成到自身的业 ...

  3. EasyDSS直播服务器如何帮助用户解决OBS不能同时同步输出多路直播流到直播平台、CDN平台的限制

    最近有用户突然寻求帮助,大概的意思就是说: 他需要同步将桌面的直播同时RTMP发布到:斗鱼.熊猫TV等等多个平台,但是OBS又只能同时采集并发布推流直播到单一个平台,而且有时候在4G或者网络比较差的情 ...

  4. 记录-Maven下载jar包失败解决办法

    maven从nexsu上面拉jar包,有时会因为网络问题导致下不了包,这时候文件夹内会个*lastUpdated.properties的文件,而这文件的存在会导致下次服务器不会去下载这个包,这时候要删 ...

  5. JDK动态代理连接池

    JDK动态代理   1 什么是JDK动态代理 刚刚写ItcastConnection时爽么?因为Connection中的方法太多了,每个都要写,所以很累吧.累点到是没什么,可以完成功能就是好的.但是不 ...

  6. window 上创建 .gitignore文件

    由于 git默认不上传空文件夹,如果需要上传空文件夹,那么需要这样上传空文件,官方给出这样的做法~~ (需要创建.gitignore文件) 在linux 上比较好操作了,这里说下在window 上 创 ...

  7. 牛客小白月赛1 B 简单题2 【数学】

    题目链接 https://www.nowcoder.com/acm/contest/85/B 思路 这个 也是 E AC代码 #include <cstdio> #include < ...

  8. 《Java并发编程的艺术》留给自己以后看的笔记

    <Java并发编程的艺术>这本书特别好,和<深入了解JAVA虚拟机>有一拼,建议做java的都看看,下面全部都是复制书中的部分内容,主要目的是做个笔记,方便以后遇到问题能找到. ...

  9. Effective java -- 8 异常

    第五十七条:只针对异常的情况才使用异常应该都有这个意识吧,就像什么抓索引越界什么的,没有必要. 第五十八条:对可恢复情况使用受检查异常,对编程错误使用运行时异常三种可抛的异常:受检的异常(checke ...

  10. 深入理解利用new创建对象的执行过程以Person p=new Person("张三",20);为例

    代码如下: class Person { private String name="haha"; private int age; private static String co ...