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

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

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

はじめに

描画処理とFMU処理の分散でスレッドはGIL(Global Interpreter Lock)仕様都合で効果を期待できないと結論が付いたが、
代わりにマルチプロセスが効果ありそうとあたりを付けた。
同時にプロセス間通信が必要とあるが、そこはPipeのバイナリ送信方式を採用。

今回はPythonでのマルチプロセスのやり方について触れる。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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

Pythonでマルチプロセス

太郎くん
太郎くん

とりあえず、マルチプロセスでやってみるってことになったけど、
具体的にはどうすれば良いのかな?

フクさん
フクさん

流れとしては以下だな。

  • Pipeの生成
  • サブプロセスを生成し、処理をしたい関数と通信用のPipeを渡す
  • サブプロセスのFMU処理で取得した描画用データをPipeで送信
  • メインプロセスでPipeで受信した描画用データをmatplotlibで描画
太郎くん
太郎くん

なるほど。
この4手順をやればいいのか。

フクさん
フクさん

最初の2つは対してたことは無いが、
残り2つは結構コードを弄ることになるかもねー。

太郎くん
太郎くん

結構めんどうだったりするの?

フクさん
フクさん

そうだねー。
dequeだったものをbyte配列にして、byte配列で受けたものをdequeに直す。
ってのが面倒かな。
やること自体はシンプルなんだけど。

太郎くん
太郎くん

まぁそこはフクさんが頑張れば良いだけだから大丈夫だね。

フクさん
フクさん

(一体なにが大丈夫だと言うんだ・・・。)

importするもの

フクさん
フクさん

まずはimportするものだ。
以下をimportすればOK。

from multiprocessing import Process, Pipe
太郎くん
太郎くん

multiprocessingってライブラリがあるのか。
そこからProcessとPipeをimport。
そのまんまで覚えやすいね。

Pipeの生成

フクさん
フクさん

次はPipeの生成。
これは簡単。

self.FMU_conn, self.plot_conn = Pipe()
太郎くん
太郎くん

この書き方だと、Pipe()の戻り値って二つあるってことになるね?

フクさん
フクさん

そうそう。
送受信用に2つ作る。
ちなみに、Pipe()は隠れた引数があって、
Pipe(True)だと双方向通信
Pipe(False)だと片方向通信
片方向通信の場合、戻り値の1個目が受信専用で、2個目が送信専用になる。
引数を省略した場合はPipe(True)と同じになるんで、
今回は双方向扱いになる。

太郎くん
太郎くん

いろいろごちゃごちゃとしてるが、
通信するから2つ必要。
その2つも双方向と片方向があるから注意してね。
ってことか。

フクさん
フクさん

(ごちゃごちゃって・・・。)

まとめ

フクさん
フクさん

まとめだよ。

  • Pythonでマルチプロセスをする上での手順確認。
    • Pipeを使ったプロセス間通信が面倒そう。
  • 追加コードについては今回は触り程度。
    • 要importのライブラリ。
      • multiprocessingのProcessとPipe。
    • Pipeの生成。
      • 送受信の2つが取得できる。
      • 引数自体で双方向、片方向が切り替わる。

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

コメント

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