バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回はPythonでマルチプロセスをする上での手順を確認。
importライブラリ、Pipeの生成の仕方と引数による双方向、片方向の切替について説明した。
今回は引き続きマルチプロセス関連の話となる。
登場人物
博識フクロウのフクさん
![指差しフクロウ](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/指差しフクロウ.png)
じゃー、次は「サブプロセスの生成と開始」について。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
お!
ついに本番な感じがしてきた!
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
コードとしては以下になる。
self.plot_p = Process(target=FMU_handler, args=(self.FMU_conn,))
self.plot_p.start()
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
Processって関数を使えばOKってことなんだと思うけど、
引数はどうなってるんだ?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
target=FMU_handler
はPython上で定義した関数で、
サブプロセスが開始した際に呼び出される関数だ。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
args=(self.FMU_conn,)
はサブプロセス開始時の関数の引数に渡すパラメータだ。
今回はPipeの片方を渡している。
これをつかってPipe通信する。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
マルチプロセスなのに、Pipeの両方を生成していたからどうするのかと思ってたけど、
サブプロセス生成時に渡せるんだね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
self.plot_p.start()
は、そのまんまでサブプロセスを開始してるんだな。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/まるフクロウ.png)
そのとおり。
Pipeで送信
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
次はPipeでデータ送信する方法。
コードは以下のイメージ。
conn.send_bytes(array('d',buf.deque_voltage))
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
connってのはPipeで、
send_bytesが送信用のメソッドだね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
引数の
array(‘d’,buf.deque_voltage)
はどう見たら良いんだろう?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
dequeのまま渡すことが出来ないので、
double型のarrayにして送信してる。
まぁsend_bytesに渡った段階でそこからさらにbyte配列になるんだけどね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
なるほど。
バイナリ方式だからデータの構造をシンプルにしないとダメってことか。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
あとは、受信と受信確認の話があるのだが、
そこそこややこしいから次回に回そう。
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- Pythonでサブプロセスの生成と開始について説明。
- Process関数を呼ぶだけ。
- 引数にサブプロセス開始時に呼び出す関数とそれに対する引数を渡せる。
- 今回はPipeを渡しておく。
- Pipeによる送信について説明。
- send_bytesを呼ぶだけ。
- dequeのままでは渡せないのでdouble型のarrayにする。
バックナンバーはこちら。
コメント