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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM