虽然node对操作体系做了许多笼统的事情,然则你照样能够直接和他交互,比方和体系中已存在的历程举行交互,建立事情子历程。node是一个用于事宜轮回的线程,然则你能够在这个事宜轮回以外建立其他的历程(线程)介入事情。
历程模块
process模块许可你取得或许修正当前node历程的设置,不想其他的模块,process是一个全局历程(node主历程),你能够直接经由过程process变量直接接见它。
process完成了EventEmitter接口,exit要领会在当历程退出的时刻实行。由于历程退出以后将不再实行事宜轮回,一切只要那些没有回调函数的代码才会被实行。在下面例子中,setTimeout内里的语句是没有办法实行到的。
process.on('exit', function () {
setTimeout(function () {
console.log('This will not run');
}, 100);
console.log('Bye.');
});
在你打仗node以后,你就会发明那些影响了主事宜轮回的非常会把全部node历程宕掉的。这会是相当严重的题目,所以process供应了别的一个有效的事宜uncaughtException来处置惩罚这个题目,他会把非常抓取出来供你处置惩罚。
process.on('uncaughtException', function (err) {
console.log('Caught exception: ' + err);
});
setTimeout(function () {
console.log('This will still run.');
}, 500);
// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');
我们来看上面的例子,我们注册了uncaughtException事宜来捕获体系非常。实行到nonexistentFunc()时,由于该函数没有定义所以会抛出非常。由于javascript是解释性的言语,nonexistentFunc()要领上面的语句不会被影响到,他下面的语句不会被实行。所以他的实行效果以下:
Caught exception: ReferenceError: nonexistentFunc is not defined
This will still run.
var http = require('http');
var server = http.createServer(function(req,res) {
res.writeHead(200, {});
res.end('response');
badLoggingCall('sent response');
console.log('sent response');
});
process.on('uncaughtException', function(e) {
console.log(e);
});
server.listen(8080);
在这里例子中我们建立了一个web服务器,当处置惩罚完要求以后,我们会实行badLoggingCall()要领。由于这个要领不存在,所以会有非常抛出。然则我们注册的uncaughtException事宜会对非常做出处置惩罚,如许服务器不会受到影响得以继承运转。我们会在服务器端纪录毛病日记。
[ReferenceError: badLoggingCall is not defined]
与当前历程交互
node供应了一些process的属性,以下:
process.version:包含当前node实例的版本号;
process.installPrefix:包含装置途径;
process.platform:枚举node运转的操作体系的环境,只会显现内核相干的信息,如:linux2, darwin,而不是“Redhat ES3” ,“Windows 7”,“OSX 10.7”等;
process.uptime():包含当前历程运转的时长(秒);
process.getgid(), process.setgid():猎取或许设置group id;
process.getuid(), process.setuid():猎取或许设想user id;
process.pid:猎取历程id;
process.title:设置历程称号;
process.execPath:当前node历程的实行途径,如:/usr/local/bin/node;
process.cwd():当前事情目次;
process.memoryUsage():node历程内存的运用情况,rss代表ram的运用情况,vsize代表总内存的运用大小,包含ram和swap;
process.heapTotal,process.heapUsed:离别代表v8引擎内存分派和正在运用的大小。
事宜轮回和ticker
node中供应了process.nextTick()要领,许可你接见事宜轮回和延时那你的事情。他有点类似于setTimeout(),他会在下次tick的时刻实行,而且每隔一段事宜就会实行一次。我们这里有个例子:
var http = require('http');
var s = http.createServer(function(req, res) {
res.writeHead(200, {});
res.end('foo');
console.log('http response');
process.nextTick(function(){console.log('tick')});
});
s.listen(8000);
当要求来的时刻,会纪录日记‘http response’和‘tick’,当没有要求的时刻,每隔一段事宜会实行事宜轮回,会输出tick。
另外,nextTick建立的回调函数具有断绝性,他们之间不会相互影响。
process.on('uncaughtException', function(e) {
console.log(e);
});
process.nextTick(function() {
console.log('tick');
});
process.nextTick(function() {
iAmAMistake();
console.log('tock');
});
process.nextTick(function() {
console.log('tick tock');
});
console.log('End of 1st loop');
在这个例子中,起首输出‘End of 1st loop’,然后递次的输出nextTick的回调函数,第一个会一般输出‘tick’,第二个是一个有意设置的非常会输出非常信息,不会输出‘tock’,由于nextTick回调函数的断绝性,第三个任然会输出‘tick tock’。效果以下:
End of 1st loop
tick
[ReferenceError: iAmAMistake is not defined]
tick tock
子历程
node供应了child_process模块,许可你为主历程建立子历程,如许你就能够运用更多的服务器资本,运用更多的cpu,这些观点在前面的章节有引见。node供应了child_process. spawn()和child_process. exec()为你完成这一功用,下面我们就零丁引见。
child_process.exec( )
我们来看exec的一个简朴例子,他建立了一个子历程,第一个参数是一个shell敕令,第二个参数是回调函数,处置惩罚返回效果。
var cp = require('child_process');
cp.exec('ls -l', function(e, stdout, stderr) {
if(!e) {
console.log(stdout);
console.log(stderr);
}
});
exec()还能够传options的参数:
var options = {
encoding: 'utf8',
timeout: 0,
maxBuffer: 200 * 1024,
killSignal: 'SIGTERM',
setsid: false,
cwd: null,
env: null
};
var cp = require('child_process');
cp.exec('ls -l', options, function(e, stdout, stderr) {
if(!e) {
console.log(stdout);
console.log(stderr);
}
});
encoding:I/O流的编码花样;
timeout:历程超时时候;
killSignal:当时候或许缓冲区超限时停止历程的信号;
maxBuffer:stdout或stderr可增进的最大值;
setsid:决定在历程中是不是建立一个新的会话;
cwd:历程的初始事情目次,为null时示意运用node的当前事情目次;
env:历程的环境变量。
child_process.spawn( )
child_process.spawn( )比child_process.exec( )越发强大和天真,例子以下:
var cp = require('child_process');
var cat = cp.spawn('cat');
cat.stdout.on('data', function(d) {
console.log(d.toString());
});
cat.on('exit', function() {
console.log('kthxbai');
});
cat.stdin.write('meow');
cat.stdin.end();