バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回はPythonでサブプロセスの生成と開始、Pipeによるデータ送信の話をした。
前回と比べて。今回は若干ややこしいところで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
Pipeで受信

次はPipe受信について。
コードはちょっとややこしいが以下になる。
tmp = conn.recv_bytes(128*1024)
deque_voltage = list(range(int(len(tmp)/8)))
for i in range(0,int(len(tmp)/8)):
deque_voltage[i] = unpack('d',tmp[(i*8):(i*8+8)])[0]

なんか思ったよりも長いな・・・。

受信自体は
conn.recv_bytes
でやってるのかな?

そして、
でも取得されるのbyte配列で欲しいのがdouble配列だから
いろいろやってる感じか。

その通り。

以下で、double型を受け入れるリストを用意して
deque_voltage = list(range(int(len(tmp)/8)))

以下で、8byte分をdoubleとして認識し直している。
って感じだ。
for i in range(0,int(len(tmp)/8)):
deque_voltage[i] = unpack('d',tmp[(i*8):(i*8+8)])[0]

これはメンドイ。
Pipeの受信確認

そして最後に「Pipeの受信確認」

これは必要なものなの?
受信処理は分かってるから、それをやればいいだけなような?

受信処理は受信するまで待ってしまうんで、
不要な時は呼び出したくないんだよね。

あー。
それの判断をするために受信確認をするのか。

そうそう。

コードとしては以下になる。
if conn.poll()
# 受信処理

あ、一関数呼べば良いのね。
Trueが帰ってくれば受信があるってことか。
次回以降

次回以降は実際に改造コードを見せて、
それの動きを確認する感じだな。
負荷がどのように変わったかを確認する。

いい感じに改善されてると良いねー。
まとめ

まとめだよ。
- Pipeの受信処理のコードを提示。
- 受信自体は一関数だが、byte配列からdoubleに直すのに手間がかかってる感じ。
- Pipeの受信確認。
- 受信関数自体は受信が来るまで戻ってこないので、無条件では呼びたくない。
- よって、poll関数で受信有無を確認した後に実際の受信処理をする。
- 次回から実際のコードと動作確認。
バックナンバーはこちら。
コメント