百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

【Python程序开发系列】双向gRPC流式传输示例-回声服务(案例)

liebian365 2025-03-25 14:57 1 浏览 0 评论

这是我的第399篇原创文章。

一、引言

以下是一个完整的双向gRPC流式传输的Python示例。这个示例包括一个简单的服务端和客户端,服务端接收客户端发送的流式数据,处理后返回流式响应。我们将通过一个简单的“回声服务”来演示这个过程,即服务端将客户端发送的每条消息原样返回。


二、实现过程

2.1 定义gRPC服务接口

首先,需要定义一个ProtoBuf文件来描述服务接口和消息格式。创建一个名为echo.proto的文件,内容如下:

syntax = "proto3";


package echo;


// 定义服务接口
service EchoService {
    rpc BidirectionalStream(stream EchoRequest) returns (stream EchoResponse);
}


// 请求消息格式
message EchoRequest {
    string message = 1;
}


// 响应消息格式
message EchoResponse {
    string message = 1;
}

然后,使用grpcio-tools生成Python代码:

python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. echo.proto

这将生成echo_pb2.py和echo_pb2_grpc.py文件,分别包含消息类和服务类的定义。

2.2 实现服务端

服务端代码负责接收客户端发送的流式数据,并将每条消息原样返回。以下是服务端的完整实现:

# server.py
from concurrent import futures
import grpc
import echo_pb2
import echo_pb2_grpc


class EchoService(echo_pb2_grpc.EchoServiceServicer):
    def BidirectionalStream(self, request_iterator, context):
        """
        处理双向流式请求
        """
        for request in request_iterator:
            print(f"Received message: {request.message}")
            # 将客户端发送的消息原样返回
            yield echo_pb2.EchoResponse(message=request.message)


def serve():
    # 创建gRPC服务器
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    echo_pb2_grpc.add_EchoServiceServicer_to_server(EchoService(), server)
    server.add_insecure_port("[::]:50051")
    server.start()
    print("Echo Service started on port 50051.")
    server.wait_for_termination()


if __name__ == "__main__":
    serve()

2.3 实现客户端

客户端代码负责发送流式数据,并接收服务端返回的流式响应。以下是客户端的完整实现:

#.py client
import grpc
import echo_pb2
import echo_pb2_grpc


def generate_messages():
    """
    生成流式请求数据
    """
    messages = ["Hello", "World", "This", "is", "a", "bidirectional", "stream"]
    for msg in messages:
        yield echo_pb2.EchoRequest(message=msg)


def run():
    # 连接到服务端
    with grpc.insecure_channel("localhost:50051") as channel:
        stub = echo_pb2_grpc.EchoServiceStub(channel)
        # 调用双向流式接口
        responses = stub.BidirectionalStream(generate_messages())
        for response in responses:
            print(f"Received response: {response.message}")


if __name__ == "__main__":
    run()

2.4 运行和测试

启动服务端:

python server.py

服务端将在localhost:50051上启动并监听客户端连接。

启动客户端:

python client.py

客户端将发送一系列消息到服务端,并接收服务端返回的响应。

服务端输出:

Echo Service started on port 50051.
Received message: Hello
Received message: World
Received message: This
Received message: is
Received message: a
Received message: bidirectional
Received message: stream

客户端输出:

Received response: Hello
Received response: World
Received response: This
Received response: is
Received response: a
Received response: bidirectional
Received response: stream

说明:

  1. 双向流式传输:客户端和服务端都可以同时发送和接收消息,非常适合实时需要交互的场景。
  2. 生成消息:客户端通过generate_messages函数生成流式请求数据,每次yield返回一条消息。
  3. 处理响应:服务端通过for request in request_iterator逐条处理客户端发送的消息,并通过yield返回响应。

在grpc的流式通信中,一个Request和一个Response并不一定是一一对应的,特别是在使用双向流式的RPC时,在双向流式RPC中,客户端可以连续发送多个Request消息,服务端可以发送多个Response消息。也就是说服务端的响应并不一定与客户端的请求完全同步,服务器可能在接收到多个请求后才开始发送响应或者接收到一个请求后发送多个响应。在流式RPC中是异步的,他们之间的关系取决于具体的实现逻辑。

作者简介: 读研期间发表6篇SCI数据算法相关论文,目前在某研究院从事数据算法相关研究工作,结合自身科研实践经历持续分享关于Python、数据分析、特征工程、机器学习、深度学习、人工智能系列基础知识与案例。关注gzh:数据杂坛,获取数据和源码学习更多内容。

原文链接:

「链接」

相关推荐

go语言也可以做gui,go-fltk让你做出c++级别的桌面应用

大家都知道go语言生态并没有什么好的gui开发框架,“能用”的一个手就能数的清,好用的就更是少之又少。今天为大家推荐一个go的gui库go-fltk。它是通过cgo调用了c++的fltk库,性能非常高...

旧电脑的首选系统:TinyCore!体积小+精简+速度极快,你敢安装吗

这几天老毛桃整理了几个微型Linux发行版,准备分享给大家。要知道可供我们日常使用的Linux发行版有很多,但其中的一些发行版经常会被大家忽视。其实这些微型Linux发行版是一种非常强大的创新:在一台...

codeblocks和VS2019下的fltk使用中文

在fltk中用中文有点问题。英文是这样。中文就成这个样子了。我查了查资料,说用UTF-8编码就行了。edit->Fileencoding->UTF-8然后保存文件。看下下边的编码指示确...

FLTK(Fast Light Toolkit)一个轻量级的跨平台Python GUI库

FLTK(FastLightToolkit)是一个轻量级的跨平台GUI库,特别适用于开发需要快速、高效且简单界面的应用程序。本文将介绍Python中的FLTK库,包括其特性、应用场景以及如何通过代...

中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux

IT之家1月29日消息,去年6月份,中科院大学教授、中科院计算所研究员包云岗,发布了开源高性能RISC-V处理器核心——香山。近日,包云岗在社交平台晒出图片,香山芯片已流片,回片后...

Linux 5.13内核有望合并对苹果M1处理器支持的初步代码

预计Linux5.13将初步支持苹果SiliconM1处理器,不过完整的支持工作可能还需要几年时间才能完全完成。虽然Linux已经可以在苹果SiliconM1上运行,但这需要通过一系列的补丁才能...

Ubuntu系统下COM口测试教程(ubuntu port)

1、在待测试的板上下载minicom,下载minicom有两种方法:方法一:在Ubuntu软件中心里面搜索下载方法二:按“Ctrl+Alt+T”打开终端,打开终端后输入“sudosu”回车;在下...

湖北嵌入式软件工程师培训怎么选,让自己脱颖而出

很多年轻人毕业即失业、面试总是不如意、薪酬不满意、在家躺平。“就业难”该如何应对,参加培训是否能改变自己的职业走向,在湖北,有哪些嵌入式软件工程师培训怎么选值得推荐?粤嵌科技在嵌入式培训领域有十几年经...

新阁上位机开发---10年工程师的Modbus总结

前言我算了一下,今年是我跟Modbus相识的第10年,从最开始的简单应用到协议了解,从协议开发到协议讲解,这个陪伴了10年的协议,它一直没变,变的只是我对它的理解和认识。我一直认为Modbus协议的存...

创建你的第一个可运行的嵌入式Linux系统-5

@ZHangZMo在MicrochipBuildroot中配置QT5选择Graphic配置文件增加QT5的配置修改根文件系统支持QT5修改output/target/etc/profile配置文件...

如何在Linux下给zigbee CC2530实现上位机

0、前言网友提问如下:粉丝提问项目框架汇总下这个网友的问题,其实就是实现一个网关程序,内容分为几块:下位机,通过串口与上位机相连;下位机要能够接收上位机下发的命令,并解析这些命令;下位机能够根据这些命...

Python实现串口助手 - 03串口功能实现

 串口调试助手是最核心的当然是串口数据收发与显示的功能,pzh-py-com借助的是pySerial库实现串口收发功能,今天痞子衡为大家介绍pySerial是如何在pzh-py-com发挥功能的。一、...

为什么选择UART(串口)作为调试接口,而不是I2C、SPI等其他接口

UART(通用异步收发传输器)通常被选作调试接口有以下几个原因:简单性:协议简单:UART的协议非常简单,只需设置波特率、数据位、停止位和校验位就可以进行通信。相比之下,I2C和SPI需要处理更多的通...

同一个类,不同代码,Qt 串口类QSerialPort 与各种外设通讯处理

串口通讯在各种外设通讯中是常见接口,因为各种嵌入式CPU中串口标配,工业控制中如果不够还通过各种串口芯片进行扩展。比如spi接口的W25Q128FV.对于软件而言,因为驱动接口固定,软件也相对好写,因...

嵌入式linux为什么可以通过PC上的串口去执行命令?

1、uboot(负责初始化基本硬bai件,如串口,网卡,usb口等,然du后引导系统zhi运行)2、linux系统(真正的操作系统)3、你的应用程序(基于操作系统的软件应用)当你开发板上电时,u...

取消回复欢迎 发表评论: