ホームページ  >  記事  >  ウェブフロントエンド  >  Nodejs ミニマリスト入門チュートリアル (3): Process_node.js

Nodejs ミニマリスト入門チュートリアル (3): Process_node.js

WBOY
WBOYオリジナル
2016-05-16 16:32:481094ブラウズ

Node には複数のスレッドがありますが、v8 で実行される JavaScript はシングルスレッドです。ノードの child_process モジュールは子プロセスの作成に使用され、子プロセスを通じて CPU を最大限に活用できます。例:

コードをコピーします コードは次のとおりです:

var fork = require('child_process').fork;
// 現在のマシンの CPU 数を取得します
var cpus = require('os').cpus();
for (var i = 0; i // 新しいプロセスを生成します
Fork('./worker.js');
}

フォークを含むプロセスの作成方法をいくつか示します:

1.spawn(command, [args], [options])、コマンド command を実行するための新しいプロセスを開始します。args はコマンド ライン パラメーターです
2.exec(command, [options], callback)、コマンド command を実行する新しいプロセスを開始します。コールバックは、プロセス終了時に標準入力、標準出力、およびエラー情報を取得するために使用されます
3.execFile(file, [args], [options], [callback])、実行可能ファイル file を実行するための新しいプロセスを開始します。コールバックは、プロセス終了時に標準入力、標準出力、およびエラー情報を取得するために使用されます
4.fork(modulePath, [args], [options])、JavaScript ファイルモジュールを実行する新しいプロセスを開始し、この時点で Node の子プロセスが作成されます

ノードプロセス間通信

親プロセス

コードをコピーします コードは次のとおりです:

// 親.js
var fork = require('child_process').fork;
// フォークは子プロセス オブジェクト n
を返します var n = fork('./child.js');
// イベントメッセージを処理します
n.on('メッセージ', function(m) {
// 子プロセスから送信されたメッセージを受信します
console.log('メッセージを取得しました: ' m);
});

//子プロセスにメッセージを送信
n.send({hello: 'world'});

子プロセス

コードをコピーします コードは次のとおりです:

// child.js
// イベントメッセージを処理します
process.on('メッセージ', function(m) {
console.log('メッセージを取得しました: ' m);
});

// プロセス内に send メソッドがあり、親プロセスにメッセージを送信するために使用されます
process.send({foo: 'bar'});

ここでの送信メソッドは同期であるため、大量のデータを送信することはお勧めできません (代わりにパイプを使用できます。詳細については、http://nodejs.org/api/ を参照してください)。すべて。html#child_process_child_process_spawn_command_args_options)。
特殊なケースでは、メッセージ内の cmd 属性値に NODE_ プレフィックスが含まれている場合 (例: {cmd: 'NODE_foo'} メッセージ)、このメッセージはメッセージ イベント (ただし、internalMessage イベント) には送信されません。 Node によって内部的に使用されます。

send メソッドのプロトタイプは次のとおりです:

コードをコピーします コードは次のとおりです:

send(メッセージ, [sendHandle])

ここで、sendHandle(handle) を使用して送信できます:

1.net.Native、ネイティブ C TCP ソケットまたはパイプ
2.net.Server、TCP サーバー
3.net.Socket、TCPソケット
4.dgram.Native、ネイティブ C UDP ソケット
5.dgram.Socket、UDP ソケット

send が sendHandle を送信する場合、実際には JavaScript オブジェクトを直接送信しません (また送信できません)。ただし、ファイル記述子は送信されます (最終的には JSON 文字列として送信されます)。他のプロセスはこのファイル記述子を使用して、対応するオブジェクトを復元できます。

次に例を見てみましょう:

親プロセス

コードをコピーします コードは次のとおりです:

// 親.js
var fork = require('child_process').fork;

var n = fork('./child.js');

var サーバー = require('net').createServer();
server.listen(7000, function() {
//TCP サーバーを子プロセスに送信します
n.send('サーバー', サーバー);
}).on('接続', function() {
console.log('接続 - 親');
});

子プロセス

コードをコピーします コードは次のとおりです:

process.on('メッセージ', function(m, h) {
If (m === 'サーバー') {
h.on('接続', function() {
console.log('接続 - 子');
});
}
});

ポート 7000 経由でこのプログラムにアクセスすると、出力は接続 - 親または接続 - 子になります。ここでは、子プロセスと親プロセスが同時にポート 7000 で待機しています。一般に、同じポートをリッスンする複数のプロセスにより EADDRINUSE 例外が発生します。この場合、2 つの異なるプロセスが同じファイル記述子を使用し、ノードの最下位層がポートでリッスンするときにソケットに SO_REUSEADDR オプションを設定します。このソケットをさまざまなプロセス間で再利用できるようにします。複数のプロセスが同じポートをリッスンする場合、ファイル記述子を同時に使用できるのは 1 つのプロセスのみであり、これらのプロセスによるソケットの使用はプリエンプティブになります。

クラスターモジュール

クラスター モジュールは Node v0.8 で追加されました。クラスター モジュールを使用すると、物理マシン上で同じポートをリッスンするプロセスのグループを簡単に構築できます。例:

コードをコピー コードは次のとおりです:

var クラスター = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

// プロセスがマスタープロセスかどうかを確認します
if (cluster.isMaster) {
for (var i = 0; i // 新しいワーカープロセスを生成します (マスタープロセスのみ呼び出すことができます)
cluster.fork();

cluster.on('exit', function(worker, code, signal) {
console.log('ワーカー ' worker.process.pid ' が死亡しました');
});
} else {
http.createServer(function(req, res) {
res.writeHead(200);
res.end('hello worldn');
}).listen(8000);
}

ワーカープロセスで listen メソッドを呼び出します。listen リクエストはマスタープロセスに渡されます。マスター プロセスにワーカー プロセスの要件を満たすリスニング サーバーがすでに存在する場合、このサーバーのハンドルがワーカーに渡されます。存在しない場合は、マスター プロセスがワーカー プロセスを作成し、そのハンドルをワーカーに渡します。ワーカープロセス。

クラスターに関する詳細なドキュメント: http://www.nodejs.org/api/cluster.html

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。