最近简单使用了下 Python 版本的 gRpc, 对使用过程中的一些问题和经验做一些总结。
环境准备
$ python -m pip install grpcio
$ python -m pip install grpcio-tools
# 编译 proto
$ python -m grpc_tools.protoc -I./protos --python_out=. --grpc_python_out=. ./protos/*.proto
protobuf 定义
定义空消息
import "google/protobuf/empty.proto";
service EmptyService {
rpc ServiceCheck(google.protobuf.Empty) returns (google.protobuf.Empty) {};
}
这个编译后,在使用时我们可以在代码中使用:
from google.protobuf import empty_pb2
...
stub.ServiceCheck(empty_pb2.Empty())
...
定义二维数组
protobuf 在定义多维数组时,会比较笨拙,需要一层一层的定义,比如二维数组的定义:
message Array2D {
message Array {
repeated int32 array = 1;
}
repeated Array array2d = 1;
}
这在使用的时候我们需要做如下操作,比如:
array2d = Array2D()
data = array2d.array2d.add()
data.array.extend([1, 2, 3])
# 这将生成 [[1,2,3]]
将 proto 与 json 互换
## from proto
from google.protobuf.json_format import MessageToDict
from google.protobuf.json_format import MessageToJson
## to proto
from google.protobuf.json_format import Parse
from google.protobuf.json_format import ParseDict
...
json_data = MesasageToJosn(requestData, indent=0) # no pretty-print
dict_data = MessageToDict(requestData)
具体参考手册:json_format