nodejsのプロcessプロセスを詳しく説明します.

5872 ワード

nodeはオペレーティングシステムに対して抽象的な仕事をたくさんしましたが、直接に彼と対話できます.例えば、システムの中にすでに存在しているプロセスと対話して、ワークプロセスを作成します.nodeはイベントのループに使うスレッドですが、このイベントのループ以外に他のプロセス(スレッド)を作成して作業に参加できます.
プロセスモジュール
processモジュールは、現在のnodeプロセスの設定を取得または変更することができます.他のモジュールは考えられません.processはグローバルプロセスです.直接にprocess変数を通じてアクセスできます.
processはEventEmitterインターフェースを実現しました.exit方法はプロセスが終了した時に実行されます.プロセスが終了するとイベントサイクルは実行されなくなりますので、すべてはコールバック関数がないコードだけが実行されます.次の例では、setTimeout内のステートメントは実行できません.

process.on('exit', function () {
  setTimeout(function () {
    console.log('This will not run');
  }, 100);
  console.log('Bye.');
});
nodeに接触した後に、あなたはあれらが主な事件の循環の異常に影響したことを発見することができます.これはかなり深刻な問題になりますので、processはもう一つの有用なイベントを提供しました.uncaught Exceptionはこの問題を解決します.彼は異常を持ち出して処理します.

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.');
 上記の例を見て、システム異常をキャプチャするためにuncaghttyExceptionイベントを登録しました.nonexistent Fun()に実行した場合、この関数は定義されていないので、異常を投げます.javascriptは説明的な言語なので、nonexistentFun()メソッド上の文は影響されません.彼の下の文は実行されません.従って彼の実行結果は以下の通りである.
Cauht exception:ReferenceErr:nonexistent Fun 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);
 この例では、ウェブサーバを作成しました.要求を処理したら、badLogggang Call()の方法を実行します.この方法は存在しないので、異常があります.しかし、私たちが登録したuncaught Exceptionイベントは異常に対処します.このようにサーバーは影響を受けずに運行を続けられます.私たちはサーバにエラーログを記録します.
[ReferenceError:badLogggg Call is not defined] 
 現在のプロセスと対話する
nodeはいくつかのprocessの属性を提供しました.
process.version:現在のnodeインスタンスのバージョン番号を含む.
process.installPrefix:インストール経路を含む.
process.plotform:nodeが実行するオペレーティングシステムの環境を列挙すると、カーネル関連の情報だけが表示されます.例えば:linux 2、darwin、「Redhat ES 3」ではなく、「Windows 7」、「OSX 10.7」などです.
process.upttime():現在のプロセスの実行時間を含む(秒);
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.heapptotal,process.heappUsed:それぞれv 8エンジンのメモリ割り当てと使用中のサイズを表します.
 イベントサイクルとチケット
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 reponse」と「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 1 st loop」を出力し、次にnextTickのフィードバック関数を順次出力し、最初は正常に「tick」を出力し、2番目は意図的に設定された異常が異常情報を出力し、「tock」は出力されない.結果は以下の通りです
End of 1 st loop tick[ReferenceErrer:i Amistare is not defined]tick tock
子プロセス
nodeはchild_を提供しました.プロcessモジュールでは、メインプロセスでサブプロセスを作成することができます.これにより、より多くのサーバーリソースを使用して、より多くのcpuを使用することができます.これらの概念は前の章で紹介されています.nodeはchild_を提供しましたprocess.spawnとchild_process.execがあなたのためにこの機能を実現するために、単独で紹介します.
ちどり_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またはstderの成長可能な最大値.
setssid:プロセスで新しいセッションを作成するかどうかを決定します.
cwd:プロセスの初期作業ディレクトリは、nullの場合、nodeを使用した現在の作業ディレクトリを表します.
env:プロセスの環境変数.
ちどり_process.spawn()
ちどり_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();
以上は小编が皆さんに绍介したnodejsの中のprocessプロセスです.