Имеется gRPC сервер с методами:
rpc monitoring (google.protobuf.Empty) returns (stream Status);
rpc getData (DataId) returns (stream Data);
Пишу на Python клиента, в частности использующего эти процедуры. По аналогии с рабочим сишным кодом реализовал следующий алгоритм. Запустил поток забора данных с процедурой getData(), а затем в основном потоке запустил мониторинг:
with grpc.insecure_channel('localhost:50051') as channel:
stub = data_service_pb2_grpc.DataServiceStub(channel)
def upload(dataId):
DataId = {'dataId': dataId}
input_stream = stub.getData(data_service_pb2.DataId(**DataId))
while True:
element = next(input_stream)
# ...
if # ЗдесьУсловиеОкончанияПотока:
break
time.sleep(1)
thread = Thread(target=upload, args=(newId,))
thread.start()
status_stream = stub.monitoring(empty_pb2.Empty())
while True:
status = next(status_stream)
print(status) # вот здесь ПУСТО, но сервер точно передает статусы
time.sleep(1)
При этом данные есть, а мониторинг возращает пустое значение. Как исправить ситуацию и заставить мониторинг monitoring читать данные? Да, что интересно. Если прервать работу скрипта и перезапустить, то данные не читаются (stub.getData) а статусы из мониторинга (stub.monitoring) читаются. Спасибо!