[转]nodejs中的process模块--child_process.exec
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模块提供了四个创建子进程的函数,分别是spawn,exec,execFile和fork。其中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还可以直接接受一个回调函数作为参数,回调函数有三个参数,分别是err, stdout , 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的更多相关文章
- 介绍nodejs中的path模块的几个方法
webpack中常用的: var path = require('path') 是nodejs中的path模块,介绍一下webpack中常用的几个path模块的方法: 应用node环境的时候,这个pa ...
- 创建多进程之multiprocess包中的process模块
创建多进程之multiprocess包中的process模块 1.process模块是一个创建进程的模块 Process([group [, target [, name [, args [, kwa ...
- nodejs中的fs模块中的方法
nodejs中的fs模块 引入模块 const fs =require("fs") 检测文件是否存在fs.stat(path,callback) fs.stat("./n ...
- 使用 nodejs 中的 http 模块实现几个超实用的工具
nodejs 方便了我们前端开发者进行一些服务端上的操作,可以进行无缝地衔接.像其他一些后端语言,如 php, golang, java 等,都需要一定的学习成本,而 nodejs 则就是为前端开发者 ...
- 浅析nodeJS中的Crypto模块,包括hash算法,HMAC算法,加密算法知识,SSL协议
node.js的crypto在0.8版本,这个模块的主要功能是加密解密. node利用 OpenSSL库(https://www.openssl.org/source/)来实现它的加密技术, 这是因为 ...
- NodeJS中的http模块
利用http模块,nodejs可以开发服务器, 极大简化服务器的创建: var http = require("http"); //创建服务器 var server = http. ...
- 60.浅谈nodejs中的Crypto模块
转自:https://www.cnblogs.com/c-and-unity/articles/4552059.html node.js的crypto在0.8版本并没有改版多少,这个模块的主要功能是加 ...
- nodeJS中使用mongoose模块操作mongodb数据库
在实际运用中,对于数据库的操作我们不可能一直在cmd命令行中进行操作,一般情况下需要在node环境中来操作mongodb数据库,这时就需要引入mongoose模块来对数据库进行增删改查等操作. 首先, ...
- nodejs中的Crypto模块
我是属于实用型的选手,千万别问我过多原理性的东西,我只知道,这个是最好的,我就用它. http://cnodejs.org/topic/504061d7fef591855112bab5
随机推荐
- 【BZOJ3993】[SDOI2015]星际战争 二分+最大流
[BZOJ3993][SDOI2015]星际战争 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地 ...
- SDOI2017第一轮
本蒟蒻表示终于$AC$了$SDOI2017\text{第一轮}$! 兴奋! 附上各个题的题解: $DAT1$: $T1$: BZOJ4816: [Sdoi2017]数字表格 $T2$: BZOJ481 ...
- SAP号码段
[转http://blog.csdn.net/wengyupeng/article/details/8513527] 1.通用Tcode:SNRO 常用维护特定Number range Tcode: ...
- php......调研投票练习
调研题目与调研选项显示页面<style type="text/css"> #list{ width:400px; height:200px;} #jieguo{ wid ...
- CodeForces - 597C Subsequences 【DP + 树状数组】
题目链接 http://codeforces.com/problemset/problem/597/C 题意 给出一个n 一个 k 求 n 个数中 长度为k的上升子序列 有多少个 思路 刚开始就是想用 ...
- 培训笔记——Linux历史
1. 计算机有分时与实时操作系统的区分,如Dos为实时操作系统,你只能给它下达一个命令,这个命令执行完了,你才能下达下一个命令:像Linux和我们用的Windows就是分时操作系统,特点是可以并发 ...
- android客户端登录&注册的实现
MainActivity多线程的实现: package com.example.loginconnect; import java.lang.ref.WeakReference; import jav ...
- P3988 [SHOI2013]发牌
题目 P3988 [SHOI2013]发牌 做法 我们切牌时的状态: 手玩几次后我们发现切\(K\)次牌就是求堆顶一下的\(K+1\)大值,套上主席树就好了 My complete code #inc ...
- Java JDK环境配置及说明
一.Java程序运行机制 Java语言编写的程序需要经过编译生成与平台无关的字节码(.class文件). 这种字节码必须使用Java解释器(JVM)来解释执行. JVM是可运行Java字节码文件的虚拟 ...
- JS正则表达式,记录自己所学所用的内容
还没接触正则表达式感觉确实有那么点难度,但接触到后自己琢磨了几天也没发现那么难. 现在教教刚学的或者还没接触正则表达式的同学们入入门,一起学习. 正则表达式基本语法 ***************** ...