ホームページ > 記事 > ウェブフロントエンド > ノードでマルチスレッドを有効にできますか?
ノードはマルチスレッドを有効にできます。ノードに付属の「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() メソッド
3 つの新しいファイル server.js (エクスプレス サービス) クラスターを作成します。 js (マルチスレッド サービス ファイル) extensionServer.js (express サブサービス)
次の操作により、express がインストールされていることを確認します
#npm intsall Express --seve-devextensionServer.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(`子服务启动成功`); })
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, };
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 { console.log(`进程号 #${worker.id} 已断开`); }); // 意外退出进程 cluster.on('exit', (worker, code, signal) => { cluster.fork(); }); } else { // 引用Express主服务 开启主进程 require('./server') }クラスターサービスノードクラスターを開始しますもちろん、引き続き子プロセスを開くこともできます。クラスター2 回目の訪問後のインターフェイス (1 回のブラウザー訪問、1 回の Postman 訪問)
サーバーは正常に開始され、現在のサービス プロセスid は xxx
は、現在のメイン プロセスの下にサブプロセスを生成するクラスター モジュールである必要があります。各サブプロセスは、メイン プロセスのすべてのメインプロセスの有無を事前に判定していますメインプロセスがある場合は、クラスタモジュールを使用して子プロセスを開きますそうでない場合は、プロセスを開きます。Express サービスをデフォルトの http サービスに変更します。server.js ファイルの内容を変更するだけです。に基づく新しいプロセスです。プロセスは互いに独立しています。各プロセスには独自の V8 インスタンスとメモリがあり、システム リソースは限られています。子プロセスをあまりにも多く生成することはお勧めできません。一般的な設定はシステム *
の数に基づいています。 CPUコア数*
const http = require('http')const { pid, ppid } = require('process')const server = http.createServer((req, res) => { res.end(router(req.url))})const router = (url) => { switch (url) { case '/132': return `进程${pid} 很高兴为你服务`; case '/456': return `进程${pid} 很高兴为你服务`; default: return `没有此接口` }}server.listen(3889, () => { console.log(`Server Started in process ${pid}`);})引き続きクラスターを開始します。 .js (マルチスレッド サービス ファイル)
nodejs ビデオ チュートリアル>>
以上がノードでマルチスレッドを有効にできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。