ノードでマルチスレッドを有効にできますか?

WBOY
リリース: 2022-06-15 17:06:37
オリジナル
2967 人が閲覧しました

ノードはマルチスレッドを有効にできます。ノードに付属の「child_process」モジュールを使用してマルチスレッドを有効にできます。構文は「child_process.fork(modulePath[, args][, options])」です。 ; このモジュールを使用すると、exec、execFile、spawn、fork の 4 種類の子プロセスを作成できます。

ノードでマルチスレッドを有効にできますか?

このチュートリアルの動作環境: Windows10 システム、nodejs バージョン 12.19.0、Dell G3 コンピューター。

ノードでマルチスレッドを有効にできますか?

ノードでマルチスレッドを有効にできますか?

Node.js がシングルスレッドで実行されることは誰もが知っています。イベント駆動型のノンブロッキング I/O モデルに基づいて、オペレーティング システムが提供する非同期 I/O を最大限に活用してマルチタスクを実行します。非同期なので、プログラムは結果が返されるのを待ってブロックする必要がないため、I/O 集中型のアプリケーション シナリオに適しています。

NodeJS マルチスレッドの出現は同時実行性を向上させるためではなく、CPU を完全に向上させるためです。使用法

マルチスレッドを開くためのいくつかの方法

Node に付属する child_process モジュールを使用します

child_process.fork(modulePath[, args][, options])
ログイン後にコピー

新しい Node.js プロセスを生成し、確立された IPC 通信チャネルを使用します (これにより、親プロセスと子プロセスの間でメッセージを送信できるようになります) を使用して、指定されたモジュールを呼び出すことができます

cluster クラスター モジュールは、サーバー ポートを共有する子プロセスを簡単に作成できます。 child_process.fork() メソッド

ノードでマルチスレッドを有効にできますか?

複数のプロセスを使用する

express

3 つの新しいファイル server.js (エクスプレス サービス) クラスターを作成します。 js (マルチスレッド サービス ファイル) extensionServer.js (express サブサービス)
次の操作により、express がインストールされていることを確認します

#npm intsall Express --seve-dev

extensionServer.js Express を使用してサブサービスを作成します

const express = require("express"), //Express框架
app = express();

// api 先关接口
app.all('/userinfo', (req, res) => {
  res.json({ name: '自夏', msg: '我在自夏 selfsummer' })
})

app.listen(4000, () => {
 console.log(`子服务启动成功`);
})
ログイン後にコピー

serve.js まず、Express マルチスレッド サービスを作成します

const  { fork } = require("child_process"),
express = require("express"), //Express框架
app = express();

const { pid, ppid } = require('process')

// api 先关接口
app.all('/123', (req, res, next) => {
   console.log(`本次进程id为: ${pid}`);
  res.end(`本次进程id为: ${pid}`)
})

app.all('/456', (req, res, next) => {
  console.log(`本次进程id为: ${pid}`);
  res.end(`本次进程id为: ${pid}`)
})


app.listen(3888, () => {
 console.log(`服务器端启动成功 父进程 ${ppid} 当前服务进程id为 ${pid}`);
 // 开启多进程
 fork('extensionServer.js')
})

module.exports = {
  app,
  express,
};
ログイン後にコピー

サービスを開始します。この時点で、メイン サービスは両方とも

ノードでマルチスレッドを有効にできますか?

Express のメイン サービスとサブサービスのアドレスに正常にアクセスできます

cluster .js Express サービスを変更しますクラスターへの接続

クラスタークラスターモジュールを使用してマルチスレッドを有効にします

const os = require('os');
const cluster = require('cluster');
const { log } = console;
const express = require("express"); //Express框架

const app = express();
const processId = process.pid;

// 判断当前是否有主进程
if (cluster.isMaster)
{
	// 获取当前本机cpu核数,开启多线程
  const cpus = os.cpus().length;
  for (let i = 0; i < cpus; i++){
    cluster.fork()
  }
	//进程已断开连接	
	  cluster.on(&#39;disconnect&#39;, (worker) => {
	    console.log(`进程号 #${worker.id} 已断开`);
	  });
	// 意外退出进程
	cluster.on(&#39;exit&#39;, (worker, code, signal) => {
	      cluster.fork();
  	});


} else
{
	// 引用Express主服务 开启主进程  
  require(&#39;./server&#39;)
}
ログイン後にコピー

クラスターサービスノードクラスターを開始します

もちろん、引き続き子プロセスを開くこともできます。クラスター

2 回目の訪問後のインターフェイス (1 回のブラウザー訪問、1 回の Postman 訪問)


ノードでマルチスレッドを有効にできますか?

なぜ複数あるのですか

サーバーは正常に開始され、現在のサービス プロセスid は xxx

は、現在のメイン プロセスの下にサブプロセスを生成するクラスター モジュールである必要があります。各サブプロセスは、メイン プロセスのすべての

に基づく新しいプロセスです。プロセスは互いに独立しています。各プロセスには独自の V8 インスタンスとメモリがあり、システム リソースは限られています。子プロセスをあまりにも多く生成することはお勧めできません。一般的な設定はシステム *
の数に基づいています。 CPUコア数*

メインプロセスの有無を事前に判定しています

メインプロセスがある場合は、クラスタモジュールを使用して子プロセスを開きます

そうでない場合は、プロセスを開きます。

Express サービスをデフォルトの http サービスに変更します。

server.js ファイルの内容を変更するだけです。

const http = require(&#39;http&#39;)const { pid, ppid } = require(&#39;process&#39;)const server = http.createServer((req, res) => {
  res.end(router(req.url))})const router = (url) => {
  switch (url)
  {
    case &#39;/132&#39;:
      return `进程${pid} 很高兴为你服务`;
    case &#39;/456&#39;:
      return `进程${pid} 很高兴为你服务`;
    default: return `没有此接口`
  }}server.listen(3889, () => {
  console.log(`Server Started in process ${pid}`);})
ログイン後にコピー
引き続きクラスターを開始します。 .js (マルチスレッド サービス ファイル)


ノードでマルチスレッドを有効にできますか?

推奨学習:「

nodejs ビデオ チュートリアル>>

以上がノードでマルチスレッドを有効にできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート