バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
描画処理とFMU処理の分散でスレッドはGIL(Global Interpreter Lock)仕様都合で効果を期待できないと結論が付いたが、
代わりにマルチプロセスが効果ありそうとあたりを付けた。
同時にプロセス間通信が必要とあるが、そこはPipeのバイナリ送信方式を採用。
今回はPythonでのマルチプロセスのやり方について触れる。
登場人物
博識フクロウのフクさん
![指差しフクロウ](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
![技術者太郎](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
Pythonでマルチプロセス
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
とりあえず、マルチプロセスでやってみるってことになったけど、
具体的にはどうすれば良いのかな?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
流れとしては以下だな。
- Pipeの生成
- サブプロセスを生成し、処理をしたい関数と通信用のPipeを渡す
- サブプロセスのFMU処理で取得した描画用データをPipeで送信
- メインプロセスでPipeで受信した描画用データをmatplotlibで描画
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
なるほど。
この4手順をやればいいのか。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
最初の2つは対してたことは無いが、
残り2つは結構コードを弄ることになるかもねー。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
結構めんどうだったりするの?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
そうだねー。
dequeだったものをbyte配列にして、byte配列で受けたものをdequeに直す。
ってのが面倒かな。
やること自体はシンプルなんだけど。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
まぁそこはフクさんが頑張れば良いだけだから大丈夫だね。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
(一体なにが大丈夫だと言うんだ・・・。)
importするもの
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まずはimportするものだ。
以下をimportすればOK。
from multiprocessing import Process, Pipe
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
multiprocessingってライブラリがあるのか。
そこからProcessとPipeをimport。
そのまんまで覚えやすいね。
Pipeの生成
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
次はPipeの生成。
これは簡単。
self.FMU_conn, self.plot_conn = Pipe()
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
この書き方だと、Pipe()の戻り値って二つあるってことになるね?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
そうそう。
送受信用に2つ作る。
ちなみに、Pipe()は隠れた引数があって、
Pipe(True)だと双方向通信。
Pipe(False)だと片方向通信。
片方向通信の場合、戻り値の1個目が受信専用で、2個目が送信専用になる。
引数を省略した場合はPipe(True)と同じになるんで、
今回は双方向扱いになる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
いろいろごちゃごちゃとしてるが、
通信するから2つ必要。
その2つも双方向と片方向があるから注意してね。
ってことか。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
(ごちゃごちゃって・・・。)
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- Pythonでマルチプロセスをする上での手順確認。
- Pipeを使ったプロセス間通信が面倒そう。
- 追加コードについては今回は触り程度。
- 要importのライブラリ。
- multiprocessingのProcessとPipe。
- Pipeの生成。
- 送受信の2つが取得できる。
- 引数自体で双方向、片方向が切り替わる。
- 要importのライブラリ。
バックナンバーはこちら。
コメント