nodejs之process历程小记

虽然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();
    原文作者:ModelT
    原文地址: https://segmentfault.com/a/1190000013130758
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞