есть ли способ установить тайм-аут на стороне сервера grpc?

Невозможно установить тайм-аут соединения grpc со стороны сервера. Возможно, что клиент устанавливает соединение, но остается в режиме ожидания / сна, что приводит к зависанию соединения с сервером grpc. Есть ли способ на стороне сервера отключить соединение через определенное время или установить тайм-аут?

Мы попытались отключить соединение со стороны клиента, но не смогли этого сделать со стороны сервера. По этой ссылке Проблема с настройкой gRPC. Получая периодическую ошибку недоступности RPC, Angad говорит, что это возможно, но невозможно определить эти параметры в python.

Мой фрагмент кода:

def serve():
server = grpc.server(thread_pool=futures.ThreadPoolExecutor(max_workers=2), maximum_concurrent_rpcs=None, options=(('grpc.so_reuseport', 1),('grpc.GRPC_ARG_KEEPALIVE_TIME_MS', 1000)))
stt_pb2_grpc.add_ListenerServicer_to_server(Listener(), server)
server.add_insecure_port("localhost:50051")
print("Server starting in port "+str(50051))
server.start()
try:
    while True:
        time.sleep(60 * 60 * 24)
except KeyboardInterrupt:
    server.stop(0)
if __name__ == '__main__':
serve()

Я ожидаю, что соединение должно быть отключено по тайм-ауту со стороны сервера grpc также в python.


person Mahesh    schedule 29.05.2019    source источник


Ответы (1)


Короче говоря, вы можете найти context.abort(...) полезным, см. справочник по API . Тайм-аут обработчика сервера не поддерживается базовым API C-Core gRPC Python. Итак, вам нужно реализовать свой собственный механизм тайм-аута в Python.

Вы можете попробовать какое-либо решение из других вопросов StackOverflow.

Или используйте простые, но с большими накладными расходами дополнительные потоки, чтобы прервать соединение через определенный промежуток времени. Это могло бы выглядеть так:

_DEFAULT_TIME_LIMIT_S = 5

class FooServer(FooServicer):

  def RPCWithTimeLimit(self, request, context):
    rpc_ended = threading.Condition()
    work_finished = threading.Event()

    def wrapper(...):
      YOUR_ACTUAL_WORK(...)
      work_finished.set()
      rpc_ended.notify_all()

    def timer():
      time.sleep(_DEFAULT_TIME_LIMIT_S)
      rpc_ended.notify_all()

    work_thread = threading.Thread(target=wrapper, ...)
    work_thread.daemon = True
    work_thread.start()

    timer_thread = threading.Thread(target=timer)
    timer_thread.daemon = True
    timer_thread.start()

    rpc_ended.wait()
    if work_finished.is_set():
      return NORMAL_RESPONSE
    else:
      context.abort(grpc.StatusCode.DEADLINE_EXCEEDED, 'RPC Time Out!')
person Lidi Zheng    schedule 04.06.2019