[转]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模块提供了四个创建子进程的函数,分别是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,布布扣,bubuko.com

时间: 2024-10-09 23:53:59

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

nodejs(第三篇):nodejs中的文件模块、nodejs中的require与exports、http模块补充、JavaScript Standard Style

一.nodejs中的文件模块 在nodejs中,用户自己编写的模块,称为文件模块. 文件模块,则是指js文件.json文件或者是.node文件.在引用文件模块的时候后要加上文件的路径:/.../.../xxx.js表示绝对路径../xxx.js表示相对路径(同一文件夹下的xxx.js),../表示上一级目录.如果既不加/.../.../又不加./的话,则该模块要么是核心模块,要么是从一个node_modules文件夹加载. (1)在Node.js中,require是一个方法,只有通过requir

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

webpack中常用的: var path = require('path') 是nodejs中的path模块,介绍一下webpack中常用的几个path模块的方法: 应用node环境的时候,这个path模块的方法经常被用到,处理路径的方法. Nodejs的path模块介绍: 网址:http://nodejs.cn/api/path.html path 模块提供了一些工具函数,用于处理文件与目录的路径.可以通过以下方式使用: const path = require('path'); 或 var

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

创建多进程之multiprocess包中的process模块 1.process模块是一个创建进程的模块 Process([group [, target [, name [, args [, kwargs]]]]]) 由该类实例化得到的对象,表示一个子进程中任务 强调: 需要使用关键字的方式来指定参数 args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号 参数介绍: group参数未使用,值始终为None target表示调用对象,即子进程要执行的任务 args表示调用对

Nodejs中路径处理模块path如何使用?

在nodejs开发中,path是个使用频率很高,但却让人又爱又恨的模块.部分因为文档说的不够清晰,部分因为接口的平台差异性. 将path的接口按照用途归类,仔细琢磨琢磨,也就没那么费解了. 获取路径/文件名/扩展名 . 获取路径:path.dirname(filepath) . 获取文件名:path.basename(filepath) . 获取扩展名:path.extname(filepath) 获取所在路径 例子如下: var path = require('path');var filep

NodeJS中的http模块

利用http模块,nodejs可以开发服务器, 极大简化服务器的创建: var http = require("http"); //创建服务器 var server = http.createServer(function(req,res){ //设置响应报文头,让类型变为html并且是utf8编码 res.setHeader("Content-Type","text/html;charset=UTF8"); //页面上显示的内容 res.end

《Nodejs开发加密货币》之九:在Nodejs中使用加密解密技术

关于 <Nodejs开发加密货币>,是一个加密货币产品的详细开发文档,涉及到使用Nodejs开发产品的方方面面,从前端到后台.从服务器到客户端.从PC到移动.加密解密.区款链等各个环节.代码完全开源.文章免费分享. 相关资源见 http://ebookchain.org QQ交流群: 185046161 前言 加密解密技术在加密货币开发中的作用不言而喻.但技术本身并不是什么新鲜事,重要的是如果没有前面的P2P网络,和后面要介绍的区块链,单独的加解密显然没有那么神奇,加密货币也不会成为无需验证.

nodejs基础 用http模块 搭建一个简单的web服务器 响应纯文本

首先说一下,我们平时在浏览器上访问网页,所看到的内容,其实是web服务器传过来的,比如我们访问www.baidu.com.当我们在浏览器地址栏输入之后,浏览器会发送请求到web服务器,然后web服务器根据请求所携带的信息,返回内容. 那么,nodejs中的http模块,就是用来搭建web服务器用的. 下面来简单的搭建一个服务器: var http = require("http"); //request:是请求参数,携带这请求所带来的信息.response:是响应参数,携带者将要返回到

nodejs中的子进程,深入解析child_process模块和cluster模块

??node遵循的是单线程单进程的模式,node的单线程是指js的引擎只有一个实例,且在nodejs的主线程中执行,同时node以事件驱动的方式处理IO等异步操作.node的单线程模式,只维持一个主线程,大大减少了线程间切换的开销. ??但是node的单线程使得在主线程不能进行CPU密集型操作,否则会阻塞主线程.对于CPU密集型操作,在node中通过child_process可以创建独立的子进程,父子进程通过IPC通信,子进程可以是外部应用也可以是node子程序,子进程执行后可以将结果返回给父进

Nodejs中cluster模块的多进程共享数据问题

Nodejs中cluster模块的多进程共享数据问题 前述 nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核CPU机器上的性能表现.本文将介绍利用cluster模块创建的多线程如何共享数据的问题. 进程间数据共享 首先举个简单的例子,代码如下: var cluster = require('cluster'); var data = 0;//这里定义数据不会被所有进程共享,各个进程有各自的内存区域 if