バックナンバーはこちら。
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つが取得できる。
- 引数自体で双方向、片方向が切り替わる。
- 要importのライブラリ。
バックナンバーはこちら。
コメント