grpc 关于 'a client-to-server stream RPC' 但错误为 'Exception iterating requests'



我做了一个关于"客户端到服务器流RPC"的演示,但当我运行客户端时,它出现了如下错误:

Traceback (most recent call last):
File "C:/Users/Administrator/Desktop/back_test_v2/gRPC/client/order_client.py", line 57, in <module>
run_client()
File "C:/Users/Administrator/Desktop/back_test_v2/gRPC/client/order_client.py", line 41, in run_client
response = stub.TransOrder(OrderRequest(orders = [SingleOrder(contract='asd',
File "C:ProgramDataAnaconda3libsite-packagesgrpc_channel.py", line 1108, in __call__
return _end_unary_response_blocking(state, call, False, None)
File "C:ProgramDataAnaconda3libsite-packagesgrpc_channel.py", line 826, in _end_unary_response_blocking
raise _InactiveRpcError(state)
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
status = StatusCode.UNKNOWN
details = "Exception iterating requests!"
debug_error_string = "None"
>

和服务器的代码

class PlaceOrder(PlaceOrderServicer):
def TransOrder(self, request_iterator, context):
for request in request_iterator:
print(f'contract is {request.contract}, begin_pos is {request.begin_pos}, end_pos is {request.end_pos}')
return OrderReply()

def serve():
server = grpc.server(futures.ThreadPoolExecutor())
add_PlaceOrderServicer_to_server(PlaceOrder(), server)
server.add_insecure_port('[::]:50062')
server.start()

客户代码:

def data():
for i in range(1, 5):
request = OrderRequest(orders=[SingleOrder(contract='asd',
begin_pos=i,
end_pos=i)])
print("Visiting OrderRequest %s" % request.contract)
yield request

def run_client():
with grpc.insecure_channel('localhost:50062') as channel:
stub = PlaceOrderStub(channel)
data1 = data()
response = stub.TransOrder(data1)

质子

service PlaceOrder {
rpc TransOrder (stream OrderRequest) returns (OrderReply) {}
}
//报单
message SingleOrder {
string contract = 1;
int32 begin_pos = 2;
int32 end_pos = 3;
}
//输出参数
message OrderRequest {
repeated SingleOrder orders = 1;
}
//输出参数
// 不需要返回消息
message OrderReply {
}

我尽可能地让它变得简单,但我仍然不明白问题出在哪里。有人能帮忙吗?

Exception iterating requests!错误消息表示请求迭代器中出现异常。我建议在客户端def data()函数中添加try-catch子句。

我相信这篇文章可能有点晚了,但至少对于那些可能想知道她在寻找解决方案的人来说,希望下面能解决你的问题,对我来说确实解决了!!

非阻塞存根方法正在寻找迭代器,但yield命令或data((方法返回Generator对象,这可能是您出现错误的原因,请尝试传递Generator的迭代器属性-这为我解决了问题。

代码片段-

def data():
for i in range(1, 5):
request = OrderRequest(orders=[SingleOrder(contract='asd',
begin_pos=i,
end_pos=i)])
print("Visiting OrderRequest %s" % request.contract)
yield request

def run_client():
with grpc.insecure_channel('localhost:50062') as channel:
stub = PlaceOrderStub(channel)
data1 = data()
#Below change should resolve the issue
response = stub.TransOrder(data1.__iter()__)

相关内容

最新更新