ノードには複数のスレッドがありますが、V8で実行されているJavaScriptは単一のスレッドです。 NodeのChild_Processモジュールは、子プロセスを作成するために使用され、子プロセスを介してCPUを最大限に活用できます。例:
コードコピーは次のとおりです。
var fork = require( 'child_process')。fork;
//現在のマシンのCPU番号を取得します
var cpus = require( 'os')。cpus();
for(var i = 0; i <cpus.length; i ++){
//新しいプロセスを生成します
fork( './ Worker.js');
}
フォークを含むプロセスを作成する方法は次のとおりです。
1.Spawn(command、[args]、[options])、コマンドコマンドを実行する新しいプロセスを開始すると、argsはコマンドラインパラメーターです
2.Exec(command、[options]、callback)、コマンドコマンドを実行する新しいプロセスを開始するコールバックは、プロセスの最後に標準入力、標準出力、およびエラー情報を取得するために使用されます。
3.Execfile(file、[args]、[options]、[callback])は、実行可能ファイルを実行する新しいプロセスを開始します。コールバックは、プロセスの最後に標準の入力、標準出力、およびエラー情報を取得するために使用されます。
4.fork(modulepath、[args]、[options])、JavaScriptファイルモジュールを実行する新しいプロセスを開始すると、この時点でノードチャイルドプロセスが作成されます。
ノードインタープロセス通信
親プロセス
コードコピーは次のとおりです。
// parent.js
var fork = require( 'child_process')。fork;
//フォークは子プロセスオブジェクトnを返します
var n = fork( './ child.js');
//イベントメッセージを処理します
n.on( 'message'、function(m){
//子プロセスから送信されたメッセージを受信します
console.log( 'got message:' + m);
});
//子プロセスにメッセージを送信します
n.send({hello: 'world'});
サブプロセス
コードコピーは次のとおりです。
// child.js
//イベントメッセージを処理します
process.on( 'message'、function(m){
console.log( 'got message:' + m);
});
//親プロセスにメッセージを送信するための送信メソッドが存在します。
process.send({foo: 'bar'});
ここの送信方法は同期しているため、大量のデータを送信することはお勧めしません(代わりにパイプを使用できます。http://nodejs.org/api/all.html#child_process_child_pocess_pawn_command_args_options for recude)。
特別な場合、メッセージのCMD属性値には、node_プレフィックス({cmd: 'node_foo'}メッセージ)が含まれています。このメッセージは、メッセージイベント(ただし内部メッサージイベント)に送信されず、ノードが内部で使用します。
送信方法のプロトタイプは次のとおりです。
コードコピーは次のとおりです。
送信(メッセージ、[sendhandle])
ここでは、sendhandle(ハンドル)を使用して送信できます。
1.Net.Native、ネイティブC ++ TCPソケットまたはパイプライン
2.Net.Server、TCPサーバー
3.Net.Socket、TCPソケット
4.Dgram.Native、ネイティブC ++ UDPソケット
5.dgram.Socket、UDPソケット
Sendhandleを送信するときに送信すると、JavaScriptオブジェクトを直接送信することではなく(最終的にはJSON文字列として送信される)ファイル記述子を送信することはできません(できません)。他のプロセスは、このファイル記述子を介して対応するオブジェクトを復元できます。
次に、例をご覧ください。
親プロセス
コードコピーは次のとおりです。
// parent.js
var fork = require( 'child_process')。fork;
var n = fork( './ child.js');
var server = require( 'net')。createServer();
server.listen(7000、function(){
// TCPサーバーを子プロセスに送信します
n.send( 'server'、server);
})。( 'connection'、function(){
console.log( 'connection -parent');
});
サブプロセス
コードコピーは次のとおりです。
process.on( 'message'、function(m、h){
if(m === 'server'){
h.on( 'connection'、function(){
console.log( 'connection -child');
});
}
});
ポート7000を介してこのプログラムにアクセスすると、接続の親または接続子として出力が発生する可能性があります。ここでは、子プロセスと親プロセスが同時にポート7000を聴きます。一般的に言えば、同じポートを聞く複数のプロセスがEaddrinuse例外を引き起こします。この場合、2つの異なるプロセスが同じファイル記述子を使用し、ノードの基礎となるレイヤーは、ポートを聴くときにソケットにSO_REUSEADDRオプションを設定します。これにより、このソケットを異なるプロセス間で再利用できます。複数のプロセスが同じポートを聴くと、ファイル記述子は同時に1つのプロセスでのみ使用でき、これらのプロセスはソケットを先制的に使用します。
クラスターモジュール
ノードのv0.8に新しいクラスターモジュールが追加されており、クラスターモジュールは物理マシンで同じポートを聞くプロセスのグループを簡単に構築できます。例:
コードコピーは次のとおりです。
var cluster = require( 'cluster');
var http = require( 'http');
var numcpus = require( 'os')。cpus()。length;
//プロセスがマスタープロセスであるかどうかを確認します
if(cluster.ismaster){
for(var i = 0; i <numcpus; ++ i)
//新しいワーカープロセスを生成します(マスタープロセスのみを呼び出すことができます)
cluster.fork();
cluster.on( 'exit'、function(worker、code、signal){
console.log( 'worker' + worker.process.pid + 'die');
});
} それ以外 {
http.createserver(function(req、res){
Res.Writehead(200);
res.End( 'Hello World/n');
})。聞きます(8000);
}
ワーカープロセスのリスニング方法を呼び出し、リスニングリクエストはマスタープロセスに渡されます。マスタープロセスがすでにワーカープロセスの要件を満たすために聴いているサーバーを持っている場合、このサーバーのハンドルはワーカーに渡されます。それが存在しない場合、マスタープロセスはそれを作成し、ハンドルをワーカープロセスに渡します。
クラスターに関するより詳細なドキュメント:http://www.nodejs.org/api/cluster.html