千家信息网

Python中gRPC框架的使用

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,简介gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C
千家信息网最后更新 2026年11月02日Python中gRPC框架的使用

简介

gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP/2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等

gRPC 默认使用 protocol buffers,这是 Google 开源的一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。

安装

官方参考文档

  • gRPC 的安装:
$ pip install grpcio
  • 安装 ProtoBuf 相关的 python 依赖库:
    $ pip install protobuf
  • 安装 python grpc 的 protobuf 编译工具:
    $ pip install grpcio-tools

实践

定义一个消息类型

先来看一个非常简单的例子。假设你想定义一个"搜索请求"的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果所在的页数,以及每一页多少条查询结果。可以采用如下的方式来定义消息类型的.proto文件了:

syntax = "proto3";  // 声明使用 proto3 语法message SearchRequest {  string query = 1;  // 每个字段都要指定数据类型  int32 page_number = 2; // 这里的数字2 是标识符,最小的标识号可以从1开始,最大到2^29 - 1, or 536,870,911。不可以使用其中的[19000-19999]  int32 result_per_page = 3; // 这里是注释,使用 //}
  • 文章的第一行指定了你正在使用 proto3 语法:如果不指定,编译器会使用 proto2。这个指定语法必须是文件的非空非注释的第一行。
  • SearchRequest消息格式有三个字段,在消息中承载的数据分别对应于每一个字段。其中每个字段都有一个名字和一种类型。
  • 向.proto文件添加注释,可以使用C/C++/java风格的双斜杠(//) 语法格式。
  • 在消息体中,每个字段都有唯一的一个数字标识符。这些标识符用来在消息的二进制格式中识别各个字段,一旦开始使用就不能再改变。

[1,15]之内的标识号在编码的时候会占用一个字节。[16,2047]之内的标识号则占用2个字节。所以应该为那些频繁出现的消息元素保留 [1,15]之内的标识号。切记:要为将来有可能添加的、频繁出现的标识号预留一些标识号。

指定字段规则

所指定的消息字段修饰符必须是如下之一:

  • singular:一个格式良好的消息应该有0个或者1个这种字段(但是不能超过1个)。
  • repeated:在一个格式良好的消息中,这种字段可以重复任意多次(包括0次)。重复的值的顺序会被保留。
    在proto3中,repeated的标量域默认情况虾使用packed。
数值类型

一个标量消息字段可以含有一个如下的类型--该表格展示了定义于.proto文件中的类型,以及与之对应的、在自动生成的访问类中定义的类型:

默认值

当一个消息被解析的时候,如果被编码的信息不包含一个特定的singular元素,被解析的对象锁对应的域被设置位一个默认值,对于不同类型指定如下:

  • 对于strings,默认是一个空string
  • 对于bytes,默认是一个空的bytes
  • 对于bools,默认是false
  • 对于数值类型,默认是0
  • 对于枚举,默认是第一个定义的枚举值,必须为0;
  • 对于消息类型(message),域没有被设置,确切的消息是根据语言确定的,详见generated code guide
  • 对于可重复域的默认值是空(通常情况下是对应语言中空列表)。
嵌套类型

你可以在其他消息类型中定义、使用消息类型,在下面的例子中,Result消息就定义在SearchResponse消息内,如:

message SearchResponse {  message Result {    string url = 1;    string title = 2;    repeated string snippets = 3;  }  repeated Result results = 1;}

在 message SearchResponse 中,定义了嵌套消息 Result,并用来定义SearchResponse消息中的results域。

Protobuf 文件编译

从.proto文件生成了什么?

当用protocol buffer编译器来运行.proto文件时,编译器将生成所选择语言的代码,这些代码可以操作在.proto文件中定义的消息类型,包括获取、设置字段值,将消息序列化到一个输出流中,以及从一个输入流中解析消息。

  • 对C++来说,编译器会为每个.proto文件生成一个.h文件和一个.cc文件,.proto文件中的每一个消息有一个对应的类。
  • 对Java来说,编译器为每一个消息类型生成了一个.java文件,以及一个特殊的Builder类(该类是用来创建消息类接口的)。
  • 对Python来说,有点不太一样--Python编译器为.proto文件中的每个消息类型生成一个含有静态描述符的模块,,该模块与一个元类(metaclass)在运行时(runtime)被用来创建所需的Python数据访问类。
  • 对go来说,编译器会位每个消息类型生成了一个.pd.go文件。
  • 对于Ruby来说,编译器会为每个消息类型生成了一个.rb文件。
  • javaNano来说,编译器输出类似域java但是没有Builder类
  • 对于Objective-C来说,编译器会为每个消息类型生成了一个pbobjc.h文件和pbobjcm文件,.proto文件中的每一个消息有一个对应的类。
  • 对于C#来说,编译器会为每个消息类型生成了一个.cs文件,.proto文件中的每一个消息有一个对应的类。

Python gRPC 示例

gRPC_DEMO GitHub源码

编译

使用以下命令编译:

$ python -m grpc_tools.protoc -I./ --python_out=. --grpc_python_out=. ./hello.proto

生成了两个文件:

  • hello_pb2.py 此文件包含生成的 request(HelloRequest) 和 response(HelloReply) 类。
  • hello_pb2_grpc.py 此文件包含生成的 客户端(GreeterStub)和服务端(GreeterServicer)的类。
创建服务端代码

创建和运行 Greeter 服务可以分为两个部分:

  • 实现我们服务定义的生成的服务接口:做我们的服务的实际的"工作"的函数。

  • 运行一个 gRPC 服务器,监听来自客户端的请求并传输服务的响应。
创建客户端代码

见gRPC_DEMO GitHub源码

运行代码
  1. 首先运行服务端代码

    python server/main.py
  2. 然后运行客户端代码

    python client/main.py
        输出:        >>> Greeter client received: Hello, goodspeed!
消息 文件 类型 编译 生成 字段 编译器 服务 标识 格式 代码 数据 运行 标识号 客户 客户端 语法 语言 标识符 注释 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海卓越科技互联网 互联网科技公司华为 互联网最新的科技 互联网 科技创新 互联网 的科技创新 碳银互联网科技 世界互联网领先科技成果 时间互联网络科技 互联网养老 桔豆科技 中国最先进互联网科技公司 成都玖崟互联网科技有限公司乐商圈怎么样 南平创想时代互联网科技有限公司 辽宁互联网新科技 佛山市翊博互联网络科技有限公司 互联网科技公司营业执照怎么办理 互联网科技股为什么大涨 昆明中奇联合互联网科技 安徽零酒互联网科技有限公司 互联网科技创业计划的风险分析 科技美学互联网 艺术 互联网扶贫科技 电子科技大学互联网 互联网科技创新企业排名 玖二柒互联网科技公司待遇 深圳前海聚择互联网科技有限公司 知域互联网科技有限公司大骗子 美国互联网科技实力 互联网科技快讯热点 信承诺互联网科技有限公司 互联网科技平台产品运营
0