作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai
Google的gRPC提供了一个框架,用于实现RPC(远程过程调用)工作流。 通过在HTTP / 2上分层并使用协议缓冲区,gRPC有望比传统的REST + JSON API带来很多好处。
文章图片
这篇文章试图从头开始,采用Python实现一个简单的功能,并通过gRPC接口提供服务。
【Python中的gRPC简化指南】因此,让我们开始学习构建。
0.定义函数 让我们创建一个要公开远程调用的 square_root 函数,它位于calculator.py 中。
import mathdef square_root(x):
y = math.sqrt(x)
return y
square_root 接受输入x,并将平方根返回为 y。 本文的其余部分将重点介绍如何通过gRPC 公开 square_root 这个函数。
1.设置协议缓冲区(protocol buffers) 协议缓冲区是一种语言中立的机制,用于序列化结构化数据。 使用它需要明确定义值及其数据类型。
让我们创建 calculator.proto,它定义我们的服务要使用的消息(message)和服务结构(service structures)。
syntax = "proto3";
message Number {
float value = https://www.it610.com/article/1;
}service Calculator {
rpc SquareRoot(Number) returns (Number) {}
}
你可以考虑以下消息(message)和服务定义(service definitions):
- Number.value 将用于包含变量 x 和 y;
- Calculator.SquareRoot 将用于函数 square_root ;
运行下面这些命令时,将遵循某些命名约定生成新文件和类。
$ pip install grpcio
$ pip install grpcio-tools$ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. calculator.proto
生成的文件如下:
calculator_pb2.py 包含 message 类
- calculator_pb2.Number 是请求和应答的变量 x 和 y 。
- calculator.pb2_grpc.CalculatorServicer 是服务端;
- calculator.pb2_grpc.CalculatorStub 是客户端;
import grpc
from concurrent import futures
import time# import the generated classes
import calculator_pb2
import calculator_pb2_grpc# import the original calculator.py
import calculator# create a class to define the server functions, derived from
# calculator_pb2_grpc.CalculatorServicer
class CalculatorServicer(calculator_pb2_grpc.CalculatorServicer):# calculator.square_root is exposed here
# the request and response are of the data type
# calculator_pb2.Number
def SquareRoot(self, request, context):
response = calculator_pb2.Number()
response.value = https://www.it610.com/article/calculator.square_root(request.value)
return response# create a gRPC server
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))# use the generated function `add_CalculatorServicer_to_server`
# to add the defined class to the server
calculator_pb2_grpc.add_CalculatorServicer_to_server(
CalculatorServicer(), server)# listen on port 50051
print('Starting server. Listening on port 50051.')
server.add_insecure_port('[::]:50051')
server.start()# since server.start() will not block,
# a sleep-loop is added to keep alive
try:
while True:
time.sleep(86400)
except KeyboardInterrupt:
server.stop(0)
我们可以使用以下命令启动服务器:
$ python server.py
Starting server. Listening on port 50051.
现在我们有了一个 gRPC 服务器,监听端口 50051。
4.创建一个gRPC客户端 完成服务器设置后,我们创建了client.py,它仅调用函数并打印结果。
import grpc# import the generated classes
import calculator_pb2
import calculator_pb2_grpc# open a gRPC channel
channel = grpc.insecure_channel('localhost:50051')# create a stub (client)
stub = calculator_pb2_grpc.CalculatorStub(channel)# create a valid request message
number = calculator_pb2.Number(value=https://www.it610.com/article/16)# make the call
response = stub.SquareRoot(number)# et voilà
print(response.value)
就是这样!
在服务器已经侦听的情况下,我们只需运行客户端即可。
$ python client.py
4.0
这篇文章使用一个非常简单的示例将一个函数转换为一个远程调用过程,这只是在非常浅层表面上做文章。
当然,gRPC可以在更高级的模式(请求流,响应流,双向流)中使用,并具有其他功能,例如错误处理和身份验证。 但是,我们所有人都必须从某个简单地方开始,我希望这篇文章对刚开始的那些人有很好的参考意义。
推荐阅读
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- Python绘制小红花
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- python|8. 文件系统——文件的删除、移动、复制过程以及链接文件
- 爬虫|若想拿下爬虫大单,怎能不会逆向爬虫,价值过万的逆向爬虫教程限时分享
- 分布式|《Python3网络爬虫开发实战(第二版)》内容介绍
- java|微软认真聆听了开源 .NET 开发社区的炮轰( 通过CLI 支持 Hot Reload 功能)