Python gRPC使用
参考文档
环境准备
下载依赖库#
pip install grpcio
pip install grpcio-tools
创建文件夹#
创建一个文件夹 project
自定义 gRPC 接口
编写一个名为 receiver.proto 文件#
目录 project/receiver.proto
syntax = "proto3";
import "google/protobuf/struct.proto";
// 服务定义 service 关键字
service Receiver {
rpc receive (Event) returns (Reply) {}
}
// 接收消息定义 message
message Event { # 可以换成直观的 message Request
string appid = 1;
int32 xwhen = 2;
string xwho = 3;
string xwhat = 4;
google.protobuf.Struct xcontext = 5;
}
// 返回消息定义 message
message Reply { # message Response
int32 status = 1;
string message = 2;
}
编译 proto 文件生成服务接口
编译命令#
在 project/ 目录下执行
python -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. receiver.proto
生成以下两个文件#
receiver_pb2.py
receiver_pb2_grpc.py
编写代码
project/server.py#
# _*_ coding: utf-8 _*_
import grpc
import receiver_pb2
import receiver_pb2_grpc
import time
from concurrent import futures
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
class Receiver(receiver_pb2_grpc.ReceiverServicer):
# 重写父类方法,返回消息
def receive(self, request, context):
print('request:', request)
print(type(request))
return receiver_pb2.Reply(message='Hello, %s!' % request.xwho)
if __name__ == '__main__':
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
receiver_pb2_grpc.add_ReceiverServicer_to_server(Receiver(), server)
server.add_insecure_port('[::]:50051')
server.start()
print('server start...')
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
project/client.py#
# _*_ coding: utf-8 _*_
import grpc
import receiver_pb2
import receiver_pb2_grpc
import time
from concurrent import futures
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
class Receiver(receiver_pb2_grpc.ReceiverServicer):
# 重写父类方法,返回消息
def receive(self, request, context):
print('request:', request)
print(type(request))
return receiver_pb2.Reply(message='Hello, %s!' % request.xwho)
if __name__ == '__main__':
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
receiver_pb2_grpc.add_ReceiverServicer_to_server(Receiver(), server)
server.add_insecure_port('[::]:50051')
server.start()
print('server start...')
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
执行结果
Server 端#
request: appid: "fuckgod"
xwhen: 123
xwho: "jerry"
xwhat: "install"
xcontext {
fields {
key: "amount"
value {
number_value: 123.0
}
}
fields {
key: "idfa"
value {
string_value: "idfa1"
}
}
}
取值方式#
# 解析 request 中的数据 (以上的数据)
# 获取 gRPC 自定义接口中的数据
appid = request.appid
xwhen = request.xwhen
xwhat = request.xwhat
xwho = request.xwho
# 取出 xcontext 中的数据
xcontent = request.xcontent
# 取出 xcconten 中的所有 fields 数据
""" fields 数据
{
'idfa': string_value: "idfa1"
'amount': number_value: 123.0
}
"""
fields = xcontent.fields
# 取出 iafa 的值
idfa = fields['idfa'].string_value
# 取出 amount 的值
amount = fields['amount'].number_value
取值总结#
什么时候用 . 取值?什么时候用 ['key‘] 取值?
打印 request 的数据中,没有引号的用 . 取值,带双引号的用 [‘key’] 取值
Client 端#
client status: 0 received: Hello, jerry!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步