概要
いつまで経っても一向に覚えられない、でも重要な
gRPC + Python の細かい実装のところを備忘録としてまとめます。
モデルがdefault型のrepeatedプロパティ を持つ時
Proto定義
syntax = "proto3";
message MyModel{
int32 size = 1;
repeated bytes data = 2;
}
例えば上のような時です。
今回はMyModel
というモデルが、bytes
という型をrepeated
の形で保持しています。
つまりbytes のリストをMyModel が所持する形です。
呼び出し方
obj = MyModel()
obj.size = 4
obj.data[:] = [byte0, byte1, ... ]
というように書きます。
モデルが カスタム型のプロパティ を持つ時
Proto定義
syntax = "proto3";
message MyData{
double data = 1;
}
message MyModel{
int32 size = 1;
MyData data = 2;
}
呼び出し方
obj = MyModel()
obj.size = 4
obj.data.CopyFrom(MyData(data=2.0))
というように書きます。
ストリームの書き方
Proto定義
syntax = "proto3";
service MyService{
rpc test(stream MyModel) returns (stream MyModel) {};
}
のように書きます。
呼び出し方(送信側)
def make_stream_data(xs, size=100):
while len(xs) > 0:
if len(xs) < size:
pb_return = MyModel()
pb_return.data[:] = xs
del xs[:len(xs)]
yield pb_return
pb_return = MyModel()
pb_return.data[:] = xs[:size]
del xs[:size]
yield pb_return
のようなヘルパー関数を書いておき、
stream = make_stream_data(data)
res = stub.test(stream)
というように書きます。
注意
このとき、注意点として、
with grpc.insecure_channel(self.address) as channel:
stub = MyStub(channel)
res = stub.test(
stream
)
と書くと、SOCKET CLOSED
となるので注意です。
上記のように、
res = stub.test(stream)
という呼び出し方にしましょう。
呼び出し方(受信側)
受け取る時は、
stream_list = []
for el in request:
stream_list = stream_list + list(el.data)
のように書き、stream_list に対して処理を実行します。
まとめ
gRPC + Python はプロトタイプを作る多くの場面で使用する可能性が高いので、
基本的な使い方はテンプレ化しておいて、サクッと作りたいですね。
今回はこの辺で。