我试图使用gRPC python进行双向流通信,但是客户端请求中存在一些问题.
这是我的心得:
service ABC {
rpc DataTransmission (stream DataTransmissionRequest) returns (stream DataTransmissionResponse);
}
message DataTransmissionRequest {
bytes data = 1;
string ticket = 2;
}
message DataTransmissionResponse {
bytes data = 1;
}
下面是我的客户端代码,用于生成迭代器请求并调用dataTransmission函数
def generateRequests():
req_msgs = [
(b"123", "sySJZDV9Rb8dyqt1"),
(b"123"),
(b"123"),
(b"123"),
(b"123"),
(b"123"),
]
iter = 0
for (req, ticket) in req_msgs:
print("(req, ticket) = ", (req, ticket))
if iter == 0:
request = ABC_pb2.DataTransmissionRequest(data=req, ticket=ticket)
else:
request = ABC_pb2.DataTransmissionRequest(data=req)
iter += 1
print("iter = ", iter)
yield request
#my_queue = queue.SimpleQueue()
with grpc.insecure_channel(addr) as channel:
stub = ABC_pb2_grpc.ServiceProxyStub(channel)
data_transmission_resp = stub.DataTransmission(generateRequests())
print("data_transmission_resp = ", data_transmission_resp)
##print("data_transmission_resp = ", list(data_transmission_resp))
## use the results
for data_trans in data_transmission_resp:
print(data_trans)
但得到了错误
grpc._channel._MultiThreadedRendezvous: <_MultiThreadedRendezvous of RPC that terminated with:
status = StatusCode.UNKNOWN
details = "Exception iterating requests!"
debug_error_string = "None"
为什么会有这个错误?这是在python上使用双向gRPC通信的正确方式吗?
然后,有一些帖子提到了以下方式:
my_queue = queue.SimpleQueue()
with grpc.insecure_channel(addr) as channel:
stub = ABC_pb2_grpc.ServiceProxyStub(channel)
my_queue.put(generateRequests())
data_transmission_resp = stub.DataTransmission(iter(my_queue.get, None))
同样的错误..。
发布于 2021-12-22 21:28:32
Exception iterating requests!
意味着请求迭代器会引发异常。我建议增加一个试捕子句,看看出了什么问题。
发布于 2022-03-24 12:57:24
对于那些希望rpc成为一元流而不是流流的人:
不幸的是,当我将自己的流声明为stream-stream
时,我也犯了同样的错误,但我使用它就像使用unary-stream
一样。我只需要修复我的消息并重新生成代码。
https://stackoverflow.com/questions/70433943
复制相似问题