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

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

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

はじめに

前回はPythonでマルチプロセスをする上での手順を確認。
importライブラリ、Pipeの生成の仕方と引数による双方向、片方向の切替について説明した。

今回は引き続きマルチプロセス関連の話となる。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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でサブプロセスの生成と開始

フクさん
フクさん

じゃー、次は「サブプロセスの生成と開始」について。

太郎くん
太郎くん

お!
ついに本番な感じがしてきた!

フクさん
フクさん

コードとしては以下になる。

self.plot_p = Process(target=FMU_handler, args=(self.FMU_conn,))
self.plot_p.start()
太郎くん
太郎くん

Processって関数を使えばOKってことなんだと思うけど、
引数はどうなってるんだ?

フクさん
フクさん

target=FMU_handler
はPython上で定義した関数で、
サブプロセスが開始した際に呼び出される関数だ。

フクさん
フクさん

args=(self.FMU_conn,)
はサブプロセス開始時の関数の引数に渡すパラメータだ。
今回はPipeの片方を渡している。
これをつかってPipe通信する。

太郎くん
太郎くん

マルチプロセスなのに、Pipeの両方を生成していたからどうするのかと思ってたけど、
サブプロセス生成時に渡せるんだね。

太郎くん
太郎くん

self.plot_p.start()
は、そのまんまでサブプロセスを開始してるんだな。

フクさん
フクさん

そのとおり。

Pipeで送信

フクさん
フクさん

次はPipeでデータ送信する方法。
コードは以下のイメージ。

conn.send_bytes(array('d',buf.deque_voltage))
太郎くん
太郎くん

connってのはPipeで、
send_bytesが送信用のメソッドだね。

太郎くん
太郎くん

引数の
array(‘d’,buf.deque_voltage)
はどう見たら良いんだろう?

フクさん
フクさん

dequeのまま渡すことが出来ないので、
double型のarrayにして送信してる。
まぁsend_bytesに渡った段階でそこからさらにbyte配列になるんだけどね。

太郎くん
太郎くん

なるほど。
バイナリ方式だからデータの構造をシンプルにしないとダメってことか。

フクさん
フクさん

あとは、受信と受信確認の話があるのだが、
そこそこややこしいから次回に回そう。

まとめ

フクさん
フクさん

まとめだよ。

  • Pythonでサブプロセスの生成と開始について説明。
    • Process関数を呼ぶだけ。
    • 引数にサブプロセス開始時に呼び出す関数とそれに対する引数を渡せる。
      • 今回はPipeを渡しておく。
  • Pipeによる送信について説明。
    • send_bytesを呼ぶだけ。
    • dequeのままでは渡せないのでdouble型のarrayにする。

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

コメント

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