我正在尝试从某些GRPC服务器接收流,我无法访问其代码。
这是我的GRPC客户端的代码:
class Client():
def __init__ (self, grpcIP, grpcPort, params):
self.channel = grpc.insecure_channel('%s:%d' % (grpcIP, grpcPort))
grpc.channel_ready_future(self.channel).result()
self.stub = pb2_grpc.DataCloneStub(self.channel)
self.params = params
self.host = grpcIP
def StartSender(self):
params = pb2.StartParameters(**self.params)
try:
res = self.stub.Start(params)
print(type(res))
for pr in res:
print(pr.current_progress)
except grpc.RpcError as e:
print(e)
以下是使用的原始文件中的片段。 方法:
rpc Start (StartParameters) returns (stream Progress) {}
流中的消息:
message Progress {
double current_progress = 1;
uint64 total_sent = 2;
uint64 total_size = 3;
string file_name = 4;
Error error = 5;
}
据我了解,self.stub.Start(params)应该返回带有Progress类型对象的迭代器。问题是它返回的类型为grpc._channel._Rendezvous。我无法遍历整个响应。它也不会捕获任何异常。
有人经历过这种行为吗?问题可能不是来自客户端吗?
答案 0 :(得分:0)
类grpc._channel._Rendezvous
也是一个迭代器,您可以检查流式RPC示例here。
您发布的代码是正确的实现。如果程序在for pr in res
行被阻止,则服务器可能没有发送任何响应(或花费很长时间),因此客户端被阻止了。