nodejsとexpressjsフレームワークを使用して、非常に基本的なWebサイトを実装しています。これは、ユーザーが Web サイトに入り、サーバーで CPU を集中的に使用するタスクをトリガーするボタンをクリックし、タスクの完了時にブラウザーにメッセージを表示するというものです。
私にとって紛らわしい部分は、イベントループをブロックせずに各ユーザーに対してこのタスクを実行する方法です。したがって、ユーザーは別のユーザーが完了するのを待つ必要はありません。また、各ユーザーが使用するリソース (オブジェクト、変数など) の新しいインスタンスを使用する方法。
遊んで読んだ後、子プロセスに出くわしました。基本的に、ソートに時間がかかってもイベントループがブロックされないように、ユーザーごとに新しい child_process をフォークすることを考えました。ただし、これがそのようなシナリオで行うのが最善かどうかはまだわかりません。
今、私はやりたいことをしましたが、単一のユーザーだけでしたが、別のユーザーを開始しようとすると、物事が乱雑になり、変数が共有されます。モジュールで宣言されたグローバル変数を使用すべきではないことはわかっていますが、単一のモジュール内の関数間で変数を共有し、ユーザーごとに変数を共有する別の方法はありますか!?
質問が非常に基本的に聞こえるかもしれませんが、ノード js が新しい変数、個々のユーザーに関連付けられたオブジェクトをさまざまなユーザーにどのように提供するかという考えがちょっと恋しいです。
要するに、私の質問は次のとおりです。1-ノードはどのように複数のユーザーに同時にサービスを提供しますか? 2-いつ、どのように新しい子プロセスをフードの下でフォークまたは実行する必要がありますか?それはユーザーごとですか、それともCPUの#コアに基づいていますか?ユーザーには、独自のカウンター、電子メール、およびその他のオブジェクトと変数があります。4-いつ必要になるか、子プロセスを強制終了する必要がありますか。
前もって感謝します。
コード:
var cp = require('child_process');
var child= cp.fork('./routes/mysort-module');
exports.user=function(req,res){
// child = new cp.fork('./routes/mysort-module'); // Should I make new child for each user?
child.on('message',function(m){ res.send('DONE');}
child.send('START PROCESS'); // Forking a cpu-intensive task in mysort-module.js
}
私のソートモジュールでは:
var variables = require(...);
//GLOBAL VARIABLES to be shared among different functions in this module
process.on('message',function(m){
//sort cpu-intensive task
process.send('DONE');
});
// OTHER FUNCTIONS in THE MODULE that make use of global variables.