如何在gRPC Python客户端进度达100%时发送流完成消息
解决方案:Python gRPC客户端单流发送进度直至完成
你的核心问题是每次循环都调用client.Progress()创建新的gRPC流,导致每个进度值都通过独立流发送,而不是在同一个流里持续推送进度直到100%完成。
原代码问题分析
原代码中,client.Progress(progressMessage(p).send(None))这一行会在每次循环时:
- 调用
progressMessage(p)生成一个只包含当前进度的生成器 - 调用
client.Progress()创建新的客户端流,并立即发送这个单条消息后关闭流
这完全不符合"单流持续推送进度"的需求。
修改后的客户端代码
import time import mypb # 你的protobuf生成模块 def sendProgress(): # 先创建一个gRPC客户端流对象,整个进度过程复用这个流 stream = client.Progress() p = 0 while p <= 100: time.sleep(1) # 向同一个流中发送当前进度消息 stream.send(mypb.Progress(progress=p)) p += 1 # 进度完成后,关闭流并接收服务端响应 response = stream.close() print("进度流已完成,服务端响应:", response) sendProgress()
关键修改说明
- 提前创建
stream = client.Progress(),整个进度周期复用这个流对象,而不是每次循环新建 - 使用
stream.send()逐个推送进度消息到同一个流中 - 当进度达到100%后,调用
stream.close()结束流,同时接收服务端返回的Empty响应
可选生成器写法
如果偏好用生成器构造消息,也可以一次性生成所有进度消息传入,gRPC会自动逐个发送并在完成后关闭流:
import time import mypb def progress_generator(): for p in range(0, 101): time.sleep(1) yield mypb.Progress(progress=p) def sendProgress(): response = client.Progress(progress_generator()) print("进度流已完成,服务端响应:", response) sendProgress()
内容的提问来源于stack exchange,提问作者Saghar Francis
相关产品推荐
相关产品推荐

