バックナンバーはこちら。
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を使用してみる。
- ただし、通常の文字列送信方式ではなく、バイナリ方式。
- 文字列方式は型を維持できて便利だがオーバーヘッドが大きい。
- Queue、Pipe、共有メモリとあるが、今回はPipeを使用してみる。
バックナンバーはこちら。
コメント