Node.js
マルチスレッド
サーチ…
前書き
Node.jsはシングルスレッドに設計されています。実用的な目的のために、Nodeで起動するアプリケーションは1つのスレッドで実行されます。
しかし、Node.js自体はマルチスレッドで動作します。 I / O操作などはスレッドプールから実行されます。さらに、ノードアプリケーションのインスタンスはすべて別のスレッド上で実行されるため、マルチスレッドアプリケーションを実行するために複数のインスタンスが起動されます。
備考
イベントループを理解することは、複数のスレッドを使用する方法と理由を理解する上で重要です。
クラスタ
cluster
モジュールを使用すると、同じアプリケーションを複数回起動することができます。
クラスタリングは、異なるインスタンスが同じ実行フローを持ち、互いに依存しない場合に望ましいです。このシナリオでは、フォークとフォーク(または子)を開始できるマスターが1つあります。子供たちは独立して働き、RamとEvent Loopの1つのスペースを持っています。
クラスタを設定することは、ウェブサイト/ APIにとって有益です。他のスレッドに依存しないため、どのスレッドも任意の顧客にサービスを提供できます。 変数は共有できないので 、Cookieを共有するにはデータベース(Redisなど)を使用します。スレッド間。
// runs in each instance
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
console.log('I am always called');
if (cluster.isMaster) {
// runs only once (within the master);
console.log('I am the master, launching workers!');
for(var i = 0; i < numCPUs; i++) cluster.fork();
} else {
// runs in each fork
console.log('I am a fork!');
// here one could start, as an example, a web server
}
console.log('I am always called as well');
子プロセス
子プロセスは、異なる初期化と懸念を伴って独立してプロセスを実行したいときに行く方法です。クラスター内のフォークのように、 child_process
はスレッドで実行されますが、フォークとは異なり、親プロセスと通信する方法があります。
コミュニケーションは両方向に進むので、親と子はメッセージを聞いてメッセージを送信できます。
親 (../parent.js)
var child_process = require('child_process');
console.log('[Parent]', 'initalize');
var child1 = child_process.fork(__dirname + '/child');
child1.on('message', function(msg) {
console.log('[Parent]', 'Answer from child: ', msg);
});
// one can send as many messages as one want
child1.send('Hello'); // Hello to you too :)
child1.send('Hello'); // Hello to you too :)
// one can also have multiple children
var child2 = child_process.fork(__dirname + '/child');
子 (../child.js)
// here would one initialize this child
// this will be executed only once
console.log('[Child]', 'initalize');
// here one listens for new tasks from the parent
process.on('message', function(messageFromParent) {
//do some intense work here
console.log('[Child]', 'Child doing some intense work');
if(messageFromParent == 'Hello') process.send('Hello to you too :)');
else process.send('what?');
})
メッセージの隣には、 'error'、 'connected'、 'disconnect'などの多くのイベントを聴くことができます。
子プロセスの開始には、それに関連する一定のコストがあります。可能な限り少数のデータを生成したいと考えています。