バックナンバーはこちら。
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にする。
バックナンバーはこちら。
コメント