LabVIEW​で​の​生産​者/​消費者​アーキテクチャ

概要

生産​者/​消費者​デザイン​パターン​は、​マスタ/​スレーブ​パターン​に​基​づ​い​て​おり、​異なる​レート​で​実行​する​複数​の​ループ​間​で​の​データ​共有​の​強化​を​目的​として​い​ます。​生産​者/​消費者​デザイン​パターン​は、​データ​の​生成​速度​と​消費​速度​が​異なる​処理​を​分割​し​ます。​生産​者/​消費者​デザイン​パターン​の​並列​ループ​は、​データ​を​生産​する​カテゴリ​と、​生産​さ​れ​た​データ​を​消費​する​カテゴリ​という​2​つ​の​カテゴリ​に​分類​さ​れ​ます。

​この​記事​では、​生産​者/​消費者​アーキテクチャ​の​一般​的​な​用途​と​利点​に​加​え、​この​技術​を​LabVIEW​内​で​使用​する​ため​の​リソース​を​紹介​し​てい​ます。​ループ​間​で​の​情報​共有​の​詳細​や、​LabVIEW​で​生産​者/​消費者​ループ​を​作成​する​ため​の​ステップ​バイ​ステップ​ガイド​および​演習​について​は、​LabVIEW 実践​集中​コース 2​の​受講​を​検討​し​て​くだ​さい。

内容

生産​者/​消費者​を​使用​する​理由

生産​者/​消費者​パターン​を​使用​すると、​個々​の​レート​で​反復​し​ながら、​同時に​複数​の​プロセス​を​簡単​に​処理​する​こと​が​でき​ます。

バッファ​型​通信

異なる​速度​で​実行​し​て​いる​複数​の​プロセス​が​ある​場合、​プロセス​間​の​バッファ​型​通信​は​非常​に​効果​的​です。​バッファ​が​十分​に​大きい​と、​生産​者​ループ​は、​データ​損失​なし​に​消費者​ループ​より​高速​で​動作​でき​ます。
​たとえば、​アプリケーション​に​2​つ​の​プロセス​が​あり、​1​番目​の​プロセス​は​データ​収集​を​実行​し、​2​番目​の​プロセス​は​その​データ​を​取得​し​て​ネットワーク​に​配置​すると​し​ます。​最初​の​プロセス​は​2​番目​の​プロセス​の​3​倍​の​速度​で​動作​し​ます。​この​アプリケーション​を​実装​する​ため​に​生産​者/​消費者​デザイン​パターン​を​使用​した​場合、​データ​収集​プロセス​は​生産​者​として​機能​し、​ネットワーク​プロセス​は​消費者​として​機能​し​ます。​十分​な​大​きさの​通信​キュー​(バッファ)​が​あれ​ば、​ネットワーク​プロセス​は、​データ​収集​ループ​が​収集​する​大量​の​データ​に​アクセス​でき​ます。​データ​を​バッファ​する​この​機能​により、​データ​損失​が​最小限​に​抑え​ら​れ​ます。

​キュー​機能​を​使用​した​場合​に​発生​する​バッファ​型​通信​を​可視​化​する​に​は、​サンプル​プログラム​の「Move LabVIEW Window Using Producer/​Consumer Loops」​を​ご覧​くだ​さい。

データ​収集​と​処理

生産​者/​消費者​パターン​は​一般​的​に、​複数​の​データセット​を​収集​し​て​順番​に​処理​する​場合​に​使用​さ​れ​ます。
​たとえば、​データ​を​受け入れ、​受け​取​っ​た​順番​で​データ​を​処理​する​アプリケーション​を​作成​すると​し​ます。​この​データ​を​キュー​に​入れる​(生産)​は​実際​の​処理​(消費)​より​はるかに​速い​ので、​生産​者/​消費者​デザイン​パターン​は​この​アプリケーション​に​最適​です。​これ​により、​消費者​ループ​は​独自​の​ペース​で​データ​を​処理​する​こと​が​でき、​生産​者​ループ​は​同時に​追加​データ​を​キュー​に​追加​する​こと​が​でき​ます。

​この​アプリケーション​で​生産​者​と​消費者​が​同じ​ループ​内​に​ある​と​考え​た​場合、データ​収集​スピード​は​データ​処理​スピード​に​合わせ​な​け​れ​ば​なら​ない​ため​遅​く​なり​ます。 これ​が、​データ​収集 (生産​者) と​処理 (消費者) という​プロセス​に、​プログラム​を​分割​する​こと​が​役に立つ​理由​です。 

ネットワーク​通信

ネットワーク​通信​では、​2​つ​の​プロセス​を​異なる​スピード​で​同時に​処理​する​こと​が​求め​ら​れ​ます。​1​番目​の​プロセス​では​絶えず​ネットワーク​ライン​を​ポーリング​し、​パケット​を​回収​し​ます。​2​番目​の​プロセス​では​1​番目​の​プロセス​で​回収​した​パケット​を​受け取り、​解析​し​ます。​この​例​において​は、​最初​の​プロセス​が​2​番目​の​プロセス​に​データ​を​要求​する​ため、​最初​の​プロセス​が​生産​者​として​機能​し、​2​番目​の​プロセス​が​消費者​として​機能​し​ます。​この​アプリケーション​は、​生産​者/​消費者​デザイン​パターン​を​使用​する​ことに​利点​が​あり​ます。​並列​する​生産​者​ループ​と​消費者​ループ​が、​データ​の​回収​と​解析​を​ネットワーク​から​切り離し​て​処理​し​ます。​また、​2​つ​の​ループ​間​で、​通信​を​待ち​行列​化​し​て​行う​ため、​回収​した​ネットワーク​パケット​の​バッファリング​が​可能​に​なり​ます。​ネットワーク​通信​が​ビジー​状態​に​なる​と、​この​バッファリング​が​非常​に​重要​に​なり​ます。​バッファリング​を​行う​こと​により、​パケット​の​回収​と​通信​が、​解析​より​も​高速​に​実行​でき​ます。

キュー​メッセージ​の​処理

キュー​メッセージ​ハンドラ​アーキテクチャは​生産​者/​消費者​アーキテクチャ​の​特別​バージョン​です。​データ​キュー​は、​生産​者/​消費者​デザイン​パターン​における​ループ​間​の​データ​通信​に​使​われ​ます。​キュー​に​は、​生産​者​と​消費者​の​ループ​間​の​データ​バッファリング​という​利点​が​あり​ます。

生産​者/​消費者​の​構築

生産​者/​消費者​デザイン​は​生産​者​と​消費者​という​2​つ​の​カテゴリ​に​分類​さ​れる​並列​ループ​で​構成​さ​れ​ます。​生産​者​ループ​と​消費者​ループ​の​間​の​通信​は、キューまたはチャンネル​ワイヤを​使用​し​て​行​われ​ます。

キュー

LabVIEW​に​は​キュー​操作​VI​が​組み​込​まれ​て​おり、​この​キュー​操作​VI​には機能パレット→データ​通信キュー​操作から​アクセス​でき​ます。

キュー​は​先​入れ/​先​出し​理論​に​基​づ​い​てい​ます。​生産​者/​消費者​デザイン​パターン​では、​キュー​を​生産​者​ループ​と​消費者​ループ​の​外​で​初期​化​する​こと​が​でき​ます。​生産​者​ループ​は​消費者​ループ​の​ため​に​データ​を​生成​する​ので、​キュー​に​データ​を​追加​し​ます​(キュー​に​データ​を​追加​する​こと​を​「エン​キュー」​といいます)。

​消費者​ループ​は​その​キュー​から​データ​を​削除​し​ます​(キュー​から​データ​を​削除​する​こと​を​「デ​キュー」​といいます)。​キュー​は​先​入れ/​先​出し​で​ある​ため、​データ​は、​常に​生産​者​が​キュー​に​追加​した​の​と​同じ​順番​で​消費者​によって​解析​さ​れ​ます。​図​1​は、​生産​者/​消費者​デザイン​パターン​を​LabVIEW​で​作成​する​方法​を​示し​てい​ます。


図​1.​生産​者/​消費者​デザイン​パターン

メモ:​この​画像​は​LabVIEW​スニペット​で、​ご​自身​の​プロジェクト​で​再​利用​できる​LabVIEW​コード​が​含​まれ​てい​ます。​この​スニペット​を​使用​する​に​は、​画像​を​右​クリック​し、​ご​自身​の​コンピュータ​に​保存​し、​保存​した​ファイル​を​LabVIEW​ダイアグラム​に​ドラッグ​し​て​くだ​さい。


​LabVIEW​で​キュー​を​使用​する​ため​の​サンプル​が​用意​さ​れ​て​おり、​ご​自身​の​アプリケーション​の​開始​点​として​使用​する​こと​が​でき​ます。​サンプル​を​見つける​に​は、​LabVIEW​サンプル​ファインダ​を​使​って、​キュー​を​検索​し​て​くだ​さい。

チャンネル

チャンネル​ワイヤ機能​は​LabVIEW 2016​で​追加​さ​れ​ま​した。​チャンネル​ワイヤ​を​使​って​キュー​と​同じ​機能​を​実現​でき​ます。

キュー​では、​キュー​リファレンス​の​セットアップ (キュー​取得)、​データ​の​追加 (エン​キュー)、​データ​の​削除 (デ​キュー) および​キュー​リファレンス​の​クローズ (キュー​解放) を​行い​ます。​チャンネル​では、​このプロセスが簡易化され、​データ​の​ライタ​と​リーダ​を​セットアップ​する​だけ​で​済み​ます。

チャンネル​ワイヤ​および​スタート​アップ​テンプレート​の​詳細​について​は、LabVIEW​ヘルプ​の​「チャンネル​ワイヤ​を​使用​し​て​並列​した​コード​セクション​の​間​で​データ​を​通信​する」を​ご覧​くだ​さい。

重要​な​注意事項

キュー​や​同期​など、​生産​者/​消費者​デザイン​パターン​を​扱う​際​に​注意​すべ​き​点​が​いくつか​あり​ます。

キュー​の​使用

問題:  キュー​は​1​つ​の​特定​の​データタイプ​に​バイ​ン​ド​さ​れ​てい​ます。​したがって、​生産​者​ループ​で​生成​さ​れる​異なる​データ​項目​ごと​に、​異なる​キュー​を​使用​する​必要​が​あり​ます。​これ​は​ブロック​ダイ​ア​グラム​が​複雑​化​する​ため、​問題​に​なる​可能性​が​あり​ます。
解決策:  キュー​は、​配列​や​クラスタ​など​の​データタイプ​を​受け入れる​こと​が​でき​ます。​各​データ​項目​は​クラスタ​内​に​配置​でき​ます。​これ​により、​様々​な​データタイプ​は​クラスタ​データタイプ​の​背後​に​隠れ​ます。​図​1​では、​通信​キュー​に​クラスタ​データタイプ​が​実装​さ​れ​てい​ます。

同期

問題:  生産​者/​消費者​デザイン​パターン​は​同期​に​基​づ​い​てい​ない​ため、​ループ​の​最初​の​実行​は​特定​の​順番​に従い​ま​せん。 したがって、​ある​ループ​を​その他​の​ループ​の​前​に​初期​化​すると、​問題​が​発生​する​可能性​が​あり​ます。

解決策:  生産​者/​消費者​デザイン​パターン​に​イベント​ストラクチャ​を​追加​する​こと​で、​この​種​の​同期​の​問題​を​解決​でき​ます。 図​2​は、​この​機能​を​実現​する​ため​の​テンプレート​を​示し​てい​ます。 同期​関数​に関する​詳細​な​情報​は、​関連​リンク​セクション​の​下​に​あり​ます。


図​2.​生産​者/​消費者​デザイン​パターン​で​イベント​ストラクチャ​を​使用​する

 メモ:​この​画像​は​LabVIEW​スニペット​で、​ご​自身​の​プロジェクト​で​再​利用​できる​LabVIEW​コード​が​含​まれ​てい​ます。​この​スニペット​を​使用​する​に​は、​画像​を​右​クリック​し、​ご​自身​の​コンピュータ​に​保存​し、​保存​した​ファイル​を​LabVIEW​ダイアグラム​に​ドラッグ​し​て​くだ​さい。