数日前、クラスメートが私に、なぜ Electron はマルチスレッドではなくマルチプロセスなのかと尋ねました。今日のことを要約して、この質問に答えてください。
まず最初に、プロセスの概念を理解しましょう。プロセスとは、コンピュータがリソースを割り当てる最小単位です。
簡単に言えば、プロセスはコンテナです。例えば、美しい小さなヴィラ、ヴィラにはベッドルーム、キッチン、書斎、バスルームなどがあり、もちろんそこには3人家族が住んでいます。お母さんが娘を遊びに連れて行ったとき、お父さんは家に一人でした。このとき、お父さんは一人で家で好きなところに行って、好きなことをすることができます。このとき、お父さんはスレッドのようなものであり(このプロセスにはアクティブなスレッドが 1 つだけあります)、小さな別荘はプロセスのようなものであり、自宅のキッチンや書斎は、このプロセスで占有されるリソースのようなものです。3 人が一緒に住んでいると (3 つのスレッドに相当)、小さな衝突が発生することがあります。たとえば、娘がアニメを見るためにテレビを占領しているとき、父親はスポーツ チャンネルを見ることができません。これはスレッド間のリソースの争奪です。 。もちろん、ほとんどの場合、スレッド間には協力関係が存在します (喧嘩するためにスレッドを作成するのであれば、なぜ作成する必要がありますか?)。たとえば、母親が台所で父と娘のために料理をし、父親が家族を養うために書斎で働いてお金を稼ぎ、娘が宿題をして義務を果たしている場合、家族は幸せで調和のとれたものになるでしょう。それに応じて、プロセスは正常に実行されています。
コンピューター上でプロセスを確認するにはどうすればよいですか?
スレッド:プログラム実行の最小単位です。
タスクマネージャーを開くと、
プログラムが停止しているか、プロセスが「ライブ」であるか、実行中です。
プロセスを作成する方法
Nodejs がサブプロセスを作成するための主な関数は 4 つあります。
spawn
、exec
、execFile
、fork
私の記事を読むことに興味があります: https://blog.csdn.net/woyebuzhidao321/article/details/129567942
コンピューターでスレッドを表示するにはどうすればよいですか?
プロセスには複数のスレッドを含めることができます。以下に示すように、それらは目に見えないものではなく、無形のものでもありません。
プロセスに複数のスレッドが含まれていることがわかります。
もう少し専門的な用語で言うと、スレッドは軽量プロセスであり、プログラム実行の最小単位です。並行プログラムの設計にマルチプロセスではなくマルチスレッドを使用するのは、スレッドの切り替えとスケジューリングのコストがプロセスのコストよりもはるかに低いためです。
スレッドの作成方法
Node.js では、Worker
オブジェクトを通じて独自のスレッド オブジェクトを作成できます。Worker は、独立した JavaScript スレッドを簡単に作成する方法を提供する Node.js の組み込みモジュールです。簡単な例を次に示します。
const {
Worker } = require('worker_threads');
// 创建新的线程
const worker = new Worker('./worker.js', {
workerData: {
message: 'hello' } });
// 监听线程消息
worker.on('message', (message) => {
console.log(`Received message from worker: ${
message}`);
});
// 监听线程错误
worker.on('error', (error) => {
console.error(`Error in worker: ${
error}`);
});
// 监听线程退出事件
worker.on('exit', (code) => {
console.log(`Worker exited with code ${
code}`);
});
上記の例では、Worker
オブジェクトを通じて新しいスレッドが作成され、workerData
オプションを使用してメッセージがスレッドに渡されます。スレッド ファイル worker.js は、workerData
属性を通じて渡されたメッセージを取得し、必要に応じてメイン スレッドにメッセージを送信できます。メインスレッドでは、スレッドのメッセージ、エラー、終了イベントを監視し、必要に応じて対応する処理を行うことができます。スレッド ファイル worker.js では、parentPort
オブジェクトを使用してメイン スレッドと通信できます。例えば:
const {
parentPort, workerData } = require('worker_threads');
console.log(`Received message in worker: ${
workerData.message}`);
// 向主线程发送消息
parentPort.postMessage('world');
上記のコードでは、workerData
属性を使用して渡されたメッセージを取得し、コンソールに出力します。次に、postMessage
メソッドを使用してメインスレッドにメッセージを送信します。Node.js の Worker オブジェクトは、プロセスベースの実装ではなくスレッドベースの実装を使用することに注意してください。したがって、作成されたスレッドは同じプロセス内で実行され、異なるスレッドが同じメモリを共有します。マルチスレッド プログラミングでは、潜在的な同時実行性の問題を回避するために、スレッド セーフと共有リソースに注意を払う必要があります。
Electron がマルチスレッドではなくマルチプロセスである理由
マルチスレッドではなくマルチプロセッシングを採用する主な理由は、セキュリティと安定性です。マルチスレッドの場合、1 つのスレッドのクラッシュによってアプリケーション全体がクラッシュする可能性がありますが、マルチプロセスの場合、1 つのプロセスのクラッシュはこのプロセスにのみ影響し、他のプロセスには影響しないため、パフォーマンスが向上します。アプリケーションのパフォーマンス、安定性。
さらに、Electron ではマルチプロセスを使用することで、リソースの管理と割り当てを改善することもできます。各プロセスには独自のメモリ空間と CPU 時間があり、システム リソースをより有効に活用し、アプリケーションのパフォーマンスを向上させることができます。
最後に、マルチプロセッシングによりセキュリティも向上します。各プロセスには独自のサンドボックス環境があり、悪意のあるコードによるアプリケーション全体の攻撃や破壊を防ぐことができます。
したがって、場合によってはマルチスレッドの方が効率的ですが、セキュリティと安定性の観点からはマルチプロセッシングの方が良い選択となります。