ホームページ  >  記事  >  ウェブフロントエンド  >  クラスターにメモリを共有させるにはどのような方法がありますか?

クラスターにメモリを共有させるにはどのような方法がありますか?

php中世界最好的语言
php中世界最好的语言オリジナル
2018-04-16 13:34:361325ブラウズ

今回は、クラスター共有メモリを作成する方法と、クラスター共有メモリを作成する際の注意事項を紹介します。以下は実際のケースです。見てみましょう。

Node.jsの標準APIはプロセス共有メモリを提供していませんが、IPCイン​​ターフェースのsendメソッドやメッセージイベントの監視により、複数のプロセス間で通信を介して共有メモリを操作する連携機構を実装できます。

##IPC の基本的な使用法:

// worker进程 发送消息
process.send(‘读取共享内存');
 
// master进程 接收消息 -> 处理 -> 发送回信
cluster.on('online', function (worker) {
   // 有worker进程建立,即开始监听message事件
   worker.on(‘message', function(data) {
     // 处理来自worker的请求
     // 回传结果
     worker.send(‘result')
   });
});

Node.js では、send および on('message', コールバックによって実装される IPC 通信には、いくつかの特徴があります。まず、マスターとワーカーは相互に通信できますが、ワーカー同士は直接通信できませんが、ワーカーはマスター転送を通じて間接的に通信できます。また、send メソッドで渡されたデータは、渡される前に JSON.stringify によって処理され、受信後、JSON.parse を使用して解析されます。したがって、Buffer オブジェクトは渡された後は配列になりますが、関数を直接渡すことはできません。一方、バッファーと関数を除くすべての データ型 は直接転送できます (これはすでに非常に強力であり、バッファーと関数は別の方法を使用して転送することもできます)。

上記の特性に基づいて、IPC を通じてメモリを共有するソリューションを設計できます。

1. ワーカープロセスは共有メモリの利用者として、共有メモリを直接操作するのではなく、send メソッドを通じてマスタプロセスに書き込み (set) または読み取り (get) 操作を実行するように通知します。

2. マスタープロセスは、Object オブジェクトを共有メモリとして初期化し、ワーカーから送信されたメッセージに従ってオブジェクトのキー値を読み書きします。

3. クロスプロセス通信が使用されるため、ワーカーによって開始される set および get は非同期操作です。マスターはリクエストに従って実際の読み取りおよび書き込み操作を実行し、結果をワーカーに返します (つまり、結果を送信します)。データを作業者に送信します)。

##データ形式

プロセス間の非同期読み書き機能を実現するには、通信データの形式を統一する必要があります。

1 つ目はワーカーのリクエスト データです:

requestMessage = {
  isSharedMemoryMessage: true, // 表示这是一次共享内存的操作通信
  method: ‘set', // or ‘get' 操作的方法
  id: cluster.worker.id, // 发起操作的进程(在一些特殊场景下,用于保证master可以回信)
  uuid: uuid, // 此次操作的(用于注册/调用回调函数)
  key: key, // 要操作的键
  value: value // 键对应的值(写入)
}

データを受信した後、マスターはメソッドに従って対応する操作を実行し、結果データを requestMessage.id に従って対応するワーカーに送信します。データ形式は次のとおりです。 データ形式を標準化する意義は、リクエストを受信したマスターが処理結果を対応するワーカーに送信し、返された結果をワーカーが受け取った後、通信に応じたコールバックを呼び出すことで連携を実現できることにある。

データ形式を標準化したら、共有メモリの機能を実現するための通信の監視と通信データの処理を行うためのコードをマスタープロセスとワーカープロセスに2つ設計します。

##ユーザークラス

User クラスのインスタンスはワーカー プロセスで動作し、共有メモリを操作するリクエストを送信し、マスターからの応答をリッスンする役割を果たします。

りー

##マネージャークラス

Manager クラスのインスタンスは、マスター プロセスで動作して、オブジェクトを共有メモリとして初期化し、User インスタンスの要求に従って共有メモリにキーと値のペアを追加するか、キー値を読み取り、結果を送り返します。

りー

##使い方

rreee 上記は、IPC 通信を通じて実装されたマルチプロセス共有メモリ機能です。この方法では、データがマスター プロセスのメモリに直接キャッシュされることに注意してください。ここで、いくつかの単純な削除を検討する必要があります。 . メモリ使用量を最適化する戦略。また、一度に読み書きするデータが比較的大きい場合、IPC通信にかかる時間もそれに応じて増加します。

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。 推奨読書:

el-uploadExcelファイルをアップロードする方法

現在の入力コンテンツのバイト数と文字数を動的に取得する

以上がクラスターにメモリを共有させるにはどのような方法がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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