目次
Shared Memory (メモリ共有)-multi-process
TCP ソケット
net
UNIX Domain Socket
四、Signal(信号)
五、Message queue(消息队列)
ホームページ ウェブフロントエンド jsチュートリアル ノードにおけるプロセス通信のいくつかの実装方法の詳細な説明

ノードにおけるプロセス通信のいくつかの実装方法の詳細な説明

Dec 14, 2021 pm 07:04 PM
node プロセスコミュニケーション

nodeプロセス間で通信するにはどうすればよいですか?次の記事は、ノード プロセスの通信方法と、これらの通信方法をノードに実装する方法を理解するのに役立ちます。

ノードにおけるプロセス通信のいくつかの実装方法の詳細な説明

通信は、実際には開発のすべてのレベルをカバーします。一般的なものには、さまざまな通信プロトコルを介したクライアントとサーバーの通信、RPC 通信、開発プロセス中のさまざまなモジュール間の通信が含まれます。 、メインの電子プロセスとレンダリング プロセス間の通信など;

この記事では主に nodejs (シングルスレッド、マルチスレッド、マルチプロセス) の通信方法を要約します。 、シナリオ、実装などを使用します。

#通信の実装方法

一般的なプロセス通信は次のように実装されます:

1. 共有メモリ (メモリ共有);

2. ソケット (ソケット);

3. パイプ (名前なしパイプ Pipe、名前付きパイプ FIFO);

4. シグナル (信号);

5 、メッセージ キュー (メッセージ キュー);

これらの通信方法をノードに実装する方法を見てみましょう

1. 共有メモリ (メモリ共有)

スタンドアロン(クライアント内の単一スレッド、単一プロセス内の複数のスレッド、単一サーバー内の複数のプロセス)、メモリ共有による通信が最も一般的な方法です。

共有メモリ (メモリ共有) - シングル スレッド

オペレーティング システム レベルから見ると、プロセス内のすべてのスレッド メモリは共有されますが、前提として、メモリが必要であるということです。既知のアクセスアドレスになります。

しかし、言語レベル (ノードまたは v8 実装レベル) から見ると、メモリ管理には直接触れず、v8 が提供する構文/API から間接的にメモリ操作を実行します。 v8 では、メモリを共有する 3 つの方法 (共有変数と呼ぶほうが適切かもしれません) を提供します:

グローバル変数ローカル変数共有パラメータ(共有による呼び出し)。

コードを実行する前に、v8 はまず Estree 仕様を通じてコードを抽象構文ツリーに変換し、それから解釈、コンパイル、実行します。抽象構文ツリー内 (抽象構文ツリーについては、私の他のを参照してください)記事), スコープがあり、メモリの読み取りは識別子(変数の名前付け)を段階的に遡って行われます。したがって、2 つのメソッド間でメモリを共有する必要がある場合は、共通のスコープ内にメモリを作成できます。

共有メモリ (メモリ共有) - マルチスレッド

クライアント環境またはノード環境では、マルチスレッドを実装できます。これら 2 つの方法は似ています (ノードはworker_threads実装を渡し、ブラウザはWorkerを通じてそれを実装します)。ここでのメモリ共有は主にメモリ操作 API (SharedArrayBuffer) を利用して実現されます。まずブラウザの実装例を見てみましょう。

// 主线程
const buffer = new SharedArrayBuffer(1024)
const typedArr = new Int16Array(buffer)
const newWorker = new Worker('./worker.js')

typedArr[0] = 20

newWorker.postMessage(buffer)
newWorker.onmessage= (data) => {
    console.group('[the main thread]');
    console.log('Data received from the main thread: %i', typedArr[0]);
    console.groupEnd();
}
// 子线程
addEventListener('message', ({ data }) => {
  const arr = new Int16Array(data)

  console.group('[the worker thread]')
  console.log('Data received from the main thread: %i', arr[0])
  console.groupEnd()
  arr[0] = 18
  
  postMessage('Updated')
})
// 结果
[the worker thread]
  Data received from the main thread: 20
[the main thread]
  Data received from the main thread: 18
ログイン後にコピー

Shared Memory (メモリ共有)-multi-process

プロセスが完了するとメモリが相互に読み取れなくなるため、 (システム レベルの制限) が開始されると、プロセス間のメモリ共有は、実際には共有メモリの新しいセクションを開くことによって実現されます。ただし、ノードは当面共有メモリをサポートしておらず、低レベル言語 (たとえば、c で実装されたshared-memory-disruptor アドオン プラグイン) を介してのみ実装できます (別の記事で説明)。

2. ソケット (ソケット)

ソケットは 2 つの実装に分かれています:

1. TCP ソケット;
2. UNIX ドメイン ソケット;
これらの主な違いは、違いは次のとおりです。

TCP Socket适用于单机,C/S架构等.但UNIX Domain Socket只适用于单机。  
UNIX Domain Socket不需要经过一系列的网络中转(协议,分包,校验等等),性能更高,稳定性更好。
ログイン後にコピー

TCP ソケット

概念: TCP ソケットは、アプリケーション層と TCP/IP プロトコル ファミリの間の通信のための中間抽象化層です。 、オペレーティング システムによって提供されます プロセス間通信メカニズム;

TCP ソケット通信は、日常の開発 (C/S アーキテクチャ) で最も一般的な通信方法の 1 つです。はさまざまなアプリケーション層プロトコル (http、websocket、rpc、ftp など) であり、ノード内の http モジュールも net モジュールに基づいて実装されます。

注: 実際、UDP は TCP 層にも属します (厳密には TCP 通信を指すのではなく、ネットワーク通信層の TCP/IP 層を指します)。ノードはそれを実装するための「dgram」モジュールを提供しますが、実際、私はアプリケーションでこれにさらされたことがないので、それについてはあまり知りません。

net

ノードでは、TCP Socket が net モジュールによって実装されており、net モジュールは主に次の機能を提供します:

1. 上位層IPC サポート (実際のパイプライン通信の実装、パイプライン通信については後で詳しく説明します);

2, net.Server クラス;

// 服务端通过net.createServer创建服务,会返回net.Server对象,可以通过返回值进行各种事件监听,端口监听
const net = require('net')

net.createServer((server => {
  server.end(`hello world!\n`)
})).listen(3302, () => {
  console.log(`running ...`)
})
ログイン後にコピー

3, net.Socket クラス;

const net = require('net')
const socket = net.createConnection({port: 3302})

socket.on('data', data => {
  console.log(data.toString())
})
ログイン後にコピー

UNIX Domain Socket

UNIX Domain Socket はファイルディスクリプタを作成し、このファイルディスクリプタの読み書きにより異なるプロセス間の通信を行います(作成プロセスと作成プロセスに分けられます)。他のプロセスはリレーとしてプロセスを作成することで相互に通信できます)。例:

// 创建进程
const net = require('net')
const unixSocketServer = net.createServer(server => {
  server.on('data', data => {
    console.log(`receive data: ${data}`)
  })
})

unixSocketServer.listen('/tmp/test', () => {
  console.log('listening...')
})
// 其他进程
const net = require('net')
const socket = net.createConnection({path: '/tmp/test'})

socket.on('data', data => {
  console.log(data.toString())
})
socket.write('my name is vb')
// 输出结果
listening...
receive data: my name is vb
ログイン後にコピー

3. パイプライン

パイプライン通信は、非名前付きパイプと名前付きパイプの 2 つのタイプに分類されます。

名前のないパイプの実装は、ファイル記述子を作成して通信する UNIX ドメイン ソケットと同じです。
名前付きパイプは固定ファイル記述子を通じて通信します:

"\\\\.\\pipe\\" + PIPE_NAME;
ログイン後にコピー

源码可参考stackoverflow(https://stackoverflow.com/questions/11750041/how-to-create-a-named-pipe-in-node-js)
目前理解的管道通信和UNIX Domain Socket实现基本一致,只是管道通信规范了读写权限,半双工通信,UNIX Domain Socket更加自由一些。

四、Signal(信号)

Signal是操作系统在终止进程前给进程发送的信号。在node中可以通过process.kill(pid, signal)/child_process.kill(pid, signal)接口实现,e.g.

// 要被终止的http守护进程
const Koa = require('koa')
const app = new Koa()

app.listen(3004, () => {
  console.log(`process pid is : ${process.pid}`) // process pid is : 75208
})
// 操作进程
process.kill(75208, 'SIGHUP') // 'SIGHUP'是一般结束进程的信号,还有更多其他的信号参考 [标识](https://blog.csdn.net/houjixin/article/details/71430489)
ログイン後にコピー

但这里的前提是你需要获取到被终止的进程pid,更多pid的内容可阅读我之前关于进程的文章。

五、Message queue(消息队列)

一开始我以为是redis,各种MQ之类的基于TCP的消息队列。但其实是操作系统内的消息队列,node暂时没有提供相关的上层接口,需要更底层实现,e.g. svmq

更多node相关知识,请访问:nodejs 教程!!

以上がノードにおけるプロセス通信のいくつかの実装方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

nvmでノードを削除する方法 nvmでノードを削除する方法 Dec 29, 2022 am 10:07 AM

nvm でノードを削除する方法: 1. 「nvm-setup.zip」をダウンロードして C ドライブにインストールします; 2. 「nvm -v」コマンドで環境変数を構成し、バージョン番号を確認します; 3. 「nvm」を使用しますinstall" コマンド ノードのインストール; 4. "nvm uninstall" コマンドでインストールしたノードを削除します。

Express を使用してノード プロジェクトでファイルのアップロードを処理する方法 Express を使用してノード プロジェクトでファイルのアップロードを処理する方法 Mar 28, 2023 pm 07:28 PM

ファイルのアップロードをどのように処理するか?次の記事では、Express を使用してノード プロジェクトでファイルのアップロードを処理する方法を紹介します。

Nodeのプロセス管理ツール「pm2」を徹底分析 Nodeのプロセス管理ツール「pm2」を徹底分析 Apr 03, 2023 pm 06:02 PM

この記事では、Node のプロセス管理ツール「pm2」について説明し、pm2 が必要な理由、pm2 のインストール方法と使用方法について説明します。皆様のお役に立てれば幸いです。

PIノードティーチング:PIノードとは何ですか? PIノードをインストールしてセットアップする方法は? PIノードティーチング:PIノードとは何ですか? PIノードをインストールしてセットアップする方法は? Mar 05, 2025 pm 05:57 PM

ピン張りのノードの詳細な説明とインストールガイドこの記事では、ピネットワークのエコシステムを詳細に紹介します - PIノードは、ピン系生態系における重要な役割であり、設置と構成の完全な手順を提供します。 Pinetworkブロックチェーンテストネットワークの発売後、PIノードは多くの先駆者の重要な部分になり、テストに積極的に参加し、今後のメインネットワークリリースの準備をしています。まだピン張りのものがわからない場合は、ピコインとは何かを参照してください。リストの価格はいくらですか? PIの使用、マイニング、セキュリティ分析。パインワークとは何ですか?ピン競技プロジェクトは2019年に開始され、独占的な暗号通貨PIコインを所有しています。このプロジェクトは、誰もが参加できるものを作成することを目指しています

pkg を使用して Node.js プロジェクトを実行可能ファイルにパッケージ化する方法について説明します。 pkg を使用して Node.js プロジェクトを実行可能ファイルにパッケージ化する方法について説明します。 Dec 02, 2022 pm 09:06 PM

Nodejs実行可能ファイルをpkgでパッケージ化するにはどうすればよいですか?次の記事では、pkg を使用して Node プロジェクトを実行可能ファイルにパッケージ化する方法を紹介します。

npm ノード gyp が失敗した場合の対処方法 npm ノード gyp が失敗した場合の対処方法 Dec 29, 2022 pm 02:42 PM

「node-gyp.js」が「Node.js」のバージョンと一致しないため、npm node gyp が失敗します。解決策は次のとおりです: 1. 「npm cache clean -f」を使用してノード キャッシュをクリアします; 2. 「npm install -」を使用します。 g n" n モジュールをインストールします。 3. 「n v12.21.0」コマンドを使用して、「node v12.21.0」バージョンをインストールします。

Angular と Node を使用したトークンベースの認証 Angular と Node を使用したトークンベースの認証 Sep 01, 2023 pm 02:01 PM

認証は、Web アプリケーションの最も重要な部分の 1 つです。このチュートリアルでは、トークンベースの認証システムと、それが従来のログイン システムとどのように異なるかについて説明します。このチュートリアルを終えると、Angular と Node.js で書かれた完全に動作するデモが表示されます。従来の認証システム トークンベースの認証システムに進む前に、従来の認証システムを見てみましょう。ユーザーはログイン フォームにユーザー名とパスワードを入力し、[ログイン] をクリックします。リクエストを行った後、データベースにクエリを実行してバックエンドでユーザーを認証します。リクエストが有効な場合、データベースから取得したユーザー情報を使用してセッションが作成され、セッション情報が応答ヘッダーで返され、セッション ID がブラウザに保存されます。対象となるアプリケーションへのアクセスを提供します。

シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか? シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか? Feb 24, 2023 pm 07:33 PM

シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?次の記事ではnodeを使ってシングルサインオンシステムを実現する方法を紹介しますので、参考になれば幸いです。

See all articles