Grpc Demo
grpc包
pip install grpcio
pip install protobuf
pip install grpcio-tools
protobuf
grpc是基于protobuf来进行数据传输的
分为四种传输方式
1. 一元RPC模式
2. 响应流式 RPC
3. 请求流式 RPC
4. 双向流式 RPC
protobuf 对应 python的数据格式
protobuf | python |
---|
double | float |
float | float |
int32 | int |
int64 | int/long |
uint32 | int/long |
uint64 | int/long |
sint32(可用于负数) | int |
sint64(可用于负数) | int/long |
bool | bool |
string(编码utf-8/ 7位ASCII,长度最大2的32次方) | string/unicode |
bytes(最长2的32次方) | py2(str)/py3(bytes) |
protobuf demo
syntax = "proto3"; // 指定protobuf版本 不指定默认使用proto2
package grpc_py; // 此文件的标识符,不添加也可以,以防止协议消息类型之间的名称冲突
message grpc_py_request { // 定义消息类型
string name = 1;
int32 age = 2;
string phone = 3;
bool avg = 4;
//bytes image = 5;
}
// 数字标识用来标识你的字段,是解析的时候的唯一标识, 1-15占一个字节,16-2047占两字节
// 区间1-536870911 !!! 19000-19999 数字字段不可用
// grpc_py_request/grpc_py_response 随便定义
// 格式: 数据类型 命名 = 数字标识符(1-536870911)
message grpc_py_response {// 定义消息类型
string name = 1;
int32 age = 2;
string phone = 3;
bool avg = 4;
//bytes image = 5;
}
// 创建连接方式 此方式是一元rpc模式
// RequestGrpcPy 随便定义 grpc_py_request是发送请求的数据
// returns 是返回 grpc_py_response 是接收的数据
// 格式 rpc xx(request) returns (response) {}
service GrpcPy {
rpc RequestGrpcPy(grpc_py_request) returns (grpc_py_response) {}
}
使用python 生产grpc文件
├── grpcs
│ ├── __init__.py
└── protos
└── grpc_py.proto
python -m grpc_tools.protoc -I. --python_out=../grpcs --grpc_python_out=../grpcs ./grpc_py.proto
├── grpcs
│ ├── grpc_py_pb2_grpc.py
│ ├── grpc_py_pb2.py
│ ├── __init__.py
└── protos
└── grpc_py.proto
编写基于grpc的grpc_server.py文件
from concurrent import futures
import grpc
import grpc_py_pb2
import grpc_py_pb2_grpc
class GrpcPy(grpc_py_pb2_grpc.GrpcPyServicer):
def RequestGrpcPy(self, request, context):
params = {
"name": request.name,
"age": request.age,
"phone": request.phone,
"avg": request.avg,
}
return grpc_py_pb2.grpc_py_response(**params)
def server():
g_server = grpc.server(futures.ThreadPoolExecutor(max_workers=10),
options=[
('grpc.max_send_message_length', 50*1024*1024),
('grpc.max_receive_message_length', 50*1024*1024)
])
grpc_py_pb2_grpc.add_GrpcPyServicer_to_server(GrpcPy(), g_server)
g_server.add_insecure_port('0.0.0.0:50051')
g_server.start()
g_server.wait_for_termination()
"""
此处是将文件的传输的阈值调大 默认是4M
options=[
('grpc.max_send_message_length', 50*1024*1024),
('grpc.max_receive_message_length',50*1024*1024)
]
"""
if __name__ == '__main__':
server()
编写基于grpc的grpc_client.py文件
import time
import grpc
import grpc_py_pb2
import grpc_py_pb2_grpc
def run():
with grpc.insecure_channel("localhost:50051",
options=[
('grpc.max_send_message_length', 50 * 1024 * 1024),
('grpc.max_receive_message_length', 50 * 1024 * 1024)]) as channel:
grpc_client = grpc_py_pb2_grpc.GrpcPyStub(channel)
start_time = time.time()
params = {
"name": "chengquan",
"age": 25,
"phone": "17744982585",
"avg": True,
"image": image_file
}
response = grpc_client.RequestGrpcPy(grpc_py_pb2.grpc_py_request(**params))
print(f"response_time--------------------{time.time() - open_time}")
print(f"response.name---------------------{response.name}")
print(f"response.age---------------------{response.age}")
print(f"response.phone---------------------{response.phone}")
print(f"response.avg---------------------{response.avg}")
print(f"spend_time-----------------{time.time() - start_time}")
if __name__ == '__main__':
run()