【PyFMI】最小構成のMBD事例 第2章 その131【リアルタイム描画㉕】

【PyFMI】最小構成のMBD事例 第2章 その131【リアルタイム描画㉕】 事例
【PyFMI】最小構成のMBD事例 第2章 その131【リアルタイム描画㉕】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/

はじめに

前回は描画負荷低減案としてスレッドの利用を検討した。
しかし、GIL(Global Interpreter Lock)の仕様の影響でさほど並行性は確保できない。
よって、対策としては見送りとした。

でもまだちょっとなんか手段がないか検討してみる。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

スレッド以外で処理分散ができないか?

太郎くん
太郎くん

前回はスレッドでうまく描画処理の影響を受けないようにと思ったけど、
GIL仕様のせいで期待はできそうもないんだよねぇ。

フクさん
フクさん

そうだね。

太郎くん
太郎くん

となると、Pythonで並行処理を期待するような記述はほぼ出来ないって感じになるのかな?

フクさん
フクさん

まぁ無いこともないが、以下の手段があるかな。

  • 別途ライブラリを作成してその中でスレッドを使いPythonから制御
  • Pythonでプロセスを生成してプロセス間通信でうまく連携
太郎くん
太郎くん

一個目はちょっともはやPythonでやってるというかライブラリの中でやってるって話だから
なんか違うなー。
それだと今回の問題のmatplotlibの利用ができなくなっちゃう。

太郎くん
太郎くん

2つ目のプロセスは・・・。
これはいけるんじゃない?

Pythonでマルチプロセス

フクさん
フクさん

うん。
今回のパターンだとマルチプロセスで解決する可能性はある。
メインプロセスでmatplotlibで描画
サブプロセスでFMU制御
という役割分担をすれば、FMU制御側が邪魔されることはなくなるだろう。

太郎くん
太郎くん

じゃーそのパターンをやってみよう。

フクさん
フクさん

ただ、プロセスが分かれるとメモリ空間の共有ができないんで、
うまいプロセス間通信を検討する必要はある。

Pythonでプロセス間通信

太郎くん
太郎くん

プロセス間通信って具体的にどんな方法があるの?

フクさん
フクさん

ざっと並べると以下だ。

  • Queue
  • Pipe
  • 共有メモリ
フクさん
フクさん

他にもあるとは思うけど、まぁそこらへんはググってもらおう。

太郎くん
太郎くん

で、どれを使うつもり?

フクさん
フクさん

Pipeバイナリ方式で送りつける方法が良いかなって思ってる。

太郎くん
太郎くん

「バイナリ方式」って言い方があるということは別の方式もあるってこと?

フクさん
フクさん

Pipeは通常だと文字列送信になるんだけど、
これはこれで便利で、
例えば、今回送りたいのは描画して欲しいデータで
それはdequeになっている。
dequeを形成している文字列をPipeで送ってそれをPythonのサブプロセスが受信すると
そっちでもdequeとして再構築して認識してもらえる。

太郎くん
太郎くん

それだったらバイナリ方式じゃなく文字列方式の方が楽なんじゃない?

フクさん
フクさん

ただ、それだと送信データの量が少なくとも3,4倍くらいになって
通信オーバーヘッドが大きくなるリスクがある。

太郎くん
太郎くん

なるほど・・・。
それでバイナリ方式で送信データサイズは減らしたいってことなのか。

まとめ

フクさん
フクさん

まとめだよ。

  • スレッド以外で処理分散を検討。
    • マルチプロセスでやれば分散できるかもしれない。
  • マルチプロセスを実現するにはプロセス間通信が必要。
    • Queue、Pipe、共有メモリとあるが、今回はPipeを使用してみる。
      • ただし、通常の文字列送信方式ではなく、バイナリ方式。
      • 文字列方式は型を維持できて便利だがオーバーヘッドが大きい。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました