You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:40:51