Ошибка при получении потока в качестве ответа в gRPC

#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. Я решил это очень легко: на самом деле это был сервер, который продолжал свое выполнение, не дожидаясь возврата функции, прежде чем дать ответ клиенту.