Back to prev

gRpc In Python

Dec 23, 2021
Linkang Chan
@Jesse Chan

最近简单使用了下 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