nodejs イベントループとマルチプロセス (3) - マルチプロセスとマルチスレッドの概要 & プロセスは複数のスレッドで構成されます & ノードはクラスターを使用してマルチプロセスを開きます & マルチプロセスのパフォーマンスは明らかに単一プロセスより優れています-ab は Apache ストレス テスト ツールに組み込まれています

nodejs イベントループとマルチプロセス (3) - マルチプロセスとマルチスレッドの概要 & プロセスは複数のスレッドで構成されます & ノードはクラスターを使用してマルチプロセスを開きます & マルチプロセスのパフォーマンスは明らかに単一プロセスより優れています-ab は Apache ストレス テスト ツールに組み込まれています

第4章 nodejsマルチプロセス

章のまとめ

  • マルチプロセッシングを使用する理由
  • マルチプロセッシングとマルチスレッドの概要
  • Nodejsをマルチスレッド、マルチプロセスで開く方法
  • クラスター原理の紹介

なぜ複数のプロセスが必要なのか

  • Nodejs はシングルスレッドであり、http リクエストの処理中にエラーが発生するとプロセス全体が終了し、致命的になります。

マルチプロセッシングとマルチスレッドの概要

プロセスはリソース割り当ての最小単位であり、スレッドは CPU スケジューリングの最小単位です。

「プロセス - リソース割り当ての最小単位、スレッド - プログラム実行の最小単位」

スレッドとは、プロセスの実行フローであり、CPU のスケジューリングとディスパッチの基本単位であり、プロセスよりも小さく、独立して実行できる基本単位です。プロセスは複数のスレッドで構成され、スレッドはプロセスが所有するすべてのリソースを同じプロセスに属する他のスレッドと共有します。

プロセス下のスレッドは通信してリソースを共有できます

プロセスには独立したアドレス空間があります。プロセスがクラッシュしても、保護モードの他のプロセスには影響せず、スレッドはプロセス内の別の実行パスにすぎません。スレッドには独自のスタックとローカル変数がありますが、スレッドには個別のアドレス空間はなく、スレッドの終了はプロセス全体の終了と同等です。

  • グーグルクローム

    • プロセス: タブはプロセスです
    • スレッド: タブは、レンダリング スレッド、JS 実行スレッド、ガベージ コレクション、サービス ワーカーなどの複数のスレッドで構成されます。
  • ノードサービス

    ab は、Apache に付属するストレス テスト ツールです。

    ab -n1000 -c20 '192.168.31.25:8000/'

    • プロセス: http サービスが特定のポートをリッスンする
    • スレッド: http サービスは、次のような複数のスレッドで構成されます。
      • メインスレッド: コードの取得、コンパイル、実行
      • コンパイル スレッド: メイン スレッドの実行時にコードを最適化できます。
      • プロファイラー スレッド: 時間のかかるメソッドを記録し、最適化のサポートを提供します。
      • その他のスレッド: ガベージコレクションとクリア作業に使用されます。複数のスレッドであるため、並行してクリアできます。

最終的にマルチプロセスかマルチスレッドを選択しますか?

マルチプロセスとマルチスレッドは組み合わせて使用​​されることが一般的ですので、どちらか一方を誤解しないでください。

ここに画像の説明を挿入

1) 頻繁に作成および破棄する必要がある優先スレッド

この原則の最も一般的な適用例は Web サーバーです。接続によってスレッドが作成され、スレッドが切断されるとスレッドは破棄されます。プロセスを使用する場合、作成と破棄にかかるコストは耐え難いものになります。

2) 計算量の多いスレッドを優先的に使用する

いわゆる大規模な計算は当然ながら多くの CPU を消費し、頻繁に切り替えられるため、この場合にはスレッドが最適です。

この原理は、画像処理とアルゴリズム処理で最も一般的です。

3) 関連性の高い処理はスレッドを使用し、関連性が弱い処理はプロセスを使用します。

強い相関と弱い相関とは何ですか? 理論的に定義するのは難しいですが、簡単な例で明確にします。

一般的なサーバーは、メッセージの送受信、およびメッセージの処理というタスクを実行する必要があります。「メッセージの送受信」と「メッセージの処理」は関連性の低いタスクであり、「メッセージの処理」は「メッセージのデコード」と「ビジネスの処理」に分けられるが、この 2 つのタスクは比較的関連性が高い。そのため、「メッセージの送受信」と「メッセージの処理」を別プロセスで設計したり、「メッセージのデコード」と「業務処理」を別のスレッドで設計したりすることができます。

4) マルチマシン分散にはプロセスを使用し、マルチコア分散にはスレッドを使用するように拡張できます。

5) すべての要件が満たされている場合は、最も使い慣れた、最も得意な方法を使用します。

概要: 高速スレッドと高いプロセス信頼性。

Nodejsのマルチスレッド化

10.5.0 のリリースでは、Node.js にマルチスレッド (worker_threads モジュール) の実験的なサポートが追加されました。2018年

Nodejs の主流はまだマルチプロセス ソリューションしかなく、API が安定してからマルチスレッドが使用できるようになります。

参考記事:https://blog.csdn.net/azard5/article/details/85016412

複数のプロセスを作成する

クラスターを使用してマルチプロセスを起動する

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length; // 获取CPU的个数
 
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 + ' died');
    });
} else {
    
    
    http.createServer(function(req, res) {
    
    
        res.writeHead(200);
        res.end("hello world\n");
    }).listen(8000);
}

わずかに最適化:

var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
 
if (cluster.isMaster) {
    
    
    for (var i = 0; i &lt; numCPUs; i++) {
    
    
        cluster.fork();
    }
    // 其它代码
    
} else {
    
    
    require("./app.js");
}

http_cluster.js

const cluster = require('cluster');  // nodejs内置模块
const http = require('http');
const cpuMuns = require('os').cpus().length;  // cpu核数

//cluser 基本原理, 就是主线程去fork 子线程,然后管理他们

if (cluster.isMaster) {
    
      // 如果你是主线程
    // cluster.fork();
    for(var i = 0; i < cpuMuns; i++) {
    
    
        cluster.fork();  // 开启子进程
    }
    cluster.on('exit', function(worker, code, signal) {
    
    
        console.log('worker ' + worker.process.pid + ' died');
    });
} else {
    
      //子线程走下面

    http.createServer((req, res) => {
    
    
        res.end('hello');
    }).listen(8001, () => {
    
    
      console.log('server is listening: ' + 8001);
    });
}

コマンドターミナル、入力します

ノード .\http_cluster.js

見せる

ここに画像の説明を挿入

ブラウザ入力

http://ローカルホスト:8001/

表示 -- こんにちは

マルチプロセスと単一プロセスのパフォーマンスの比較

マルチプロセスのパフォーマンスは単一プロセスよりも大幅に優れています

ab は、Apache に付属するストレス テスト ツールです。みんなにMacの使用を勧める

ab -n1000 -c20 '192.168.31.25:8000/'

  • n 件のリクエスト
  • c 同時接続数

nodejsのデバッグ方法

https://code.visualstudio.com/Docs/editor/debugging

vscode的 .vscode文件下面配置 launch.json

{
    
    
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [

        
        {
    
    
            "type": "node",
            "request": "launch",
            "name": "Launch Program",
            "program": "${workspaceFolder}/chapter4/http_cluster.js"
        }
    ]
}

おすすめ

転載: blog.csdn.net/weixin_44867717/article/details/131546422
おすすめ