zoukankan      html  css  js  c++  java
  • Python中的gRPC简化指南

    Google的gRPC提供了用于实现RPC(远程过程调用)工作流的框架。通过在HTTP / 2之上分层并使用协议缓冲区,gRPC有望比传统的REST + JSON API带来很多好处。



    0.定义功能

    让我们创建一个我们想要公开(远程调用的函数(过程)— square_root,位于calculator.py

    import math
    
    
    def square_root(x):
        y = math.sqrt(x)
        return y
    
    
    if __name__ == '__main__':
        print(square_root(16))
     

    square_root接受输入x,并将平方根返回为y。本文的其余部分将重点介绍如何通过gRPC公开square_root。


    1.设置协议缓冲区

    协议缓冲区是一种语言中立的机制,用于序列化结构化数据。使用它需要明确定义值及其数据类型。

    让我们创建calculator.proto,它定义我们的服务要使用的消息和服务结构

    syntax = "proto3";
    
    message Number {
        float value = 1;
    }
    
    service Calculator {
        rpc SquareRoot(Number) returns (Number) {}
    }
     

    您可以考虑以下消息和服务定义:

    • Number.value将用于包含变量x和y
    • Calculator.SquareRoot将用于函数square_root

    2.为Python生成gRPC类

    此部分可能是整个过程中“黑匣子”的部分。我们将使用特殊的工具来自动生成类。

    运行这些命令时,将遵循某些命名约定生成新文件(和类)。(您可以参考文档中使用的各种标志。在本文中,所有文件都位于单个文件夹中,命令在同一文件夹中运行。)

    $ pip install grpcio
    $ pip install grpcio-tools
    
    $ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. calculator.proto

    生成的文件如下:

    Calculator_pb2.py  —包含消息类

    • Calculator_pb2。请求/响应变量的编号(x和y)

    Calculator_pb2_grpc.py  —包含服务器和客户端类

    • 服务器的Calculator_pb2_grpc.CalculatorServicer
    • 客户端的Calculator_pb2_grpc.CalculatorStub

    3.创建一个gRPC服务器

    现在,我们拥有创建gRPC服务器calc_server.py所需的所有组件,如下所示。内联注释应解释每个部分。

    import grpc
    from concurrent import futures
    import time
    
    # import the generated classes
    from example import calculator_pb2, calculator
    from example import calculator_pb2_grpc
    
    
    # 创建一个类来定义服务器功能
    # 派生自Calculator_pb2_grpc.CalculatorServicer
    class CalculatorServicer(calculator_pb2_grpc.CalculatorServicer):
    
        # 公开 Calculator.square_root
        # 请求和响应属于数据类型,生成Calculator_pb2.Number
        def SquareRoot(self, request, context):
            response = calculator_pb2.Number()
            response.value = calculator.square_root(request.value)
            return response
    
    
    # 创建一个gRPC服务器
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    
    # 使用生成的函数`add_CalculatorServicer_to_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()
    
    # server.start不会阻塞,添加了一个睡眠循环以保持
    try:
        while True:
            time.sleep(86400)
    except KeyboardInterrupt:
        server.stop(0)
     

    我们可以使用以下命令启动服务器,

    $ python calc_server.py
    Starting server. Listening on port 50051.

    现在我们有了一个gRPC服务器,监听端口50051。


    4.创建一个gRPC客户端

    完成服务器设置后,我们创建calc_client.py-仅调用函数并打印结果。

     
    import grpc
    from example import calculator_pb2
    from example import calculator_pb2_grpc
    
    # 打开一个gRPC通道
    channel = grpc.insecure_channel('localhost:50051')
    # 创建一个存根(客户端)
    stub = calculator_pb2_grpc.CalculatorStub(channel)
    
    # 创建有效的请求消息
    number = calculator_pb2.Number(value=16)
    
    # 调用
    response = stub.SquareRoot(number)
    print(response.value)

     

    在服务器已经侦听的情况下,我们只需运行客户端即可。

    $ python calc_client.py
    4.0
     

    从顶部开始

    以下是每个文件的用途。

    basic-grpc-python/
    ├── example/calculator.py          #包含函数的模块
    |
    ├── example/calculator.proto       # protobuf定义文件
    |
    ├── example/calculator_pb2_grpc.py # 为服务器/客户端生成的类
    ├── example/calculator_pb2.py      # 生成的消息类
    |
    ├── server/calc_server.py              # 服务器
    └── client/calc_client.py              # 客户端

    这篇文章使用一个非常简单的示例将一个函数转换为一个远程过程,只是在表面上做文章。

    当然,gRPC可以在更高级的模式(请求流,响应流,双向流)中使用,并具有其他功能,例如错误处理和身份验证。

    代码参考:

    https://github.com/Kitty2014/gRPC_demo

    详细编辑产生code参考谷歌文档:

    https://developers.google.com/protocol-buffers/docs/reference/python-generated

  • 相关阅读:
    acdream.18.KIDx's Triangle(数学推导)
    upc.2219: A^X mod P(打表 && 超越快速幂(in some ways))
    山东省第四届acm.Rescue The Princess(数学推导)
    BC.5200.Trees(dp)
    BC.36.Gunner(hash)
    hdu.5195.DZY Loves Topological Sorting(topo排序 && 贪心)
    数组倒置算法扩展
    C# 传值和传引用 ( ref out in )
    C# 输出文件夹下的所有文件
    控制反转(自译)
  • 原文地址:https://www.cnblogs.com/a00ium/p/12300234.html
Copyright © 2011-2022 走看看