#python #grpc
#питон #grpc
Вопрос:
Я пытаюсь реализовать службу, в которой по запросу клиента я могу получать поток в качестве ответа.
Прото заключается в следующем
syntax = "proto3"; service VideoClassifier{ rpc GetServerClassification(Image) returns (stream Result) {} } message Result{ int64 id = 1; float x1 = 2; float x2 = 3; float y1 = 4; float y2 = 5; string label = 6; float confidence = 7; } message Image{ bytes image = 1; int32 width = 2; int32 heigth = 3; int32 id = 4; }
Клиент реализует rpc следующим образом:
def make_image(stub , f , w , h, id_video ): frame= mec_ar_pb2.Image(image = f, width = w , heigth = h, id = id_video) r = stub.GetServerClassification(frame ) print(type(r)) for resp in r: print(resp) return frame
Однако при печати типа потока ответов «r» я получаю следующий тип:
lt;class 'grpc._channel._MultiThreadedRendezvous'gt;
И клиент вызывает следующее исключение:
grpc._channel._MultiThreadedRendezvous: lt;_MultiThreadedRendezvous of RPC that terminated with: status = StatusCode.UNKNOWN details = "Exception iterating responses: 'NoneType' object is not an iterator" debug_error_string = "{"created":"@1638824058.895157000","description":"Error received from peer ipv6:[::1]:50051","file":"src/core/lib/surface/call.cc","file_line":1064,"grpc_message":"Exception iterating responses: 'NoneType' object is not an iterator","grpc_status":2}" gt;
Можете ли вы рассказать мне больше о том, что происходит? Я думаю, что проблема на стороне клиента. Если вам также нужен сервер, просто скажите мне, и я смогу отредактировать вопрос с помощью сервера.
Спасибо
Комментарии:
1. Привет, не могли бы вы добавить код сервера для этой функции? Похоже, что вы не возвращаете сообщение
iter
с сервера или что — то в этом роде. Я протестировал возврат сервераreturn iter([Result(id=x, x1=1, x2=2, y1=1,y2=2, label="", confidence=0.0) for x in [1]])
, и он работает.2. Я решил это очень легко: на самом деле это был сервер, который продолжал свое выполнение, не дожидаясь возврата функции, прежде чем дать ответ клиенту.