python gRP C клиент отключается во время ответа потокового сервера - PullRequest
0 голосов
/ 09 апреля 2020

Добрый день,

Это мой первый пост, так что извините, если я что-то не так с постом. Я пытаюсь запустить службу типа подписки, которая работает нормально, пока клиент не отключится. В зависимости от времени это работает нормально или блокируется на неопределенный срок.

def Subscribe(self, request, context):
    words = ["Please", "help", "me", "solve", "my", "problem", "!"] 

    while context.is_active():
        try:
            for word in words:
                event = fr_pb2.Event(word=word)
                if not context.is_active():
                    break
                yield event
                print (event)                    
        except Exception as ex:
            print(ex)
            context.cancel()

    print("Subscribe ended")

Я новичок в gRP C, поэтому, возможно, я кое-что делаю неправильно, но моя главная проблема заключается в том, что если клиент отключается непосредственно перед / во время выхода, код зависает на неопределенный срок. Я попытался несколько вещей, чтобы выйти из этой ситуации, но они работают только несколько раз. Тайм-аут, установленный на стороне клиента, ведет обратный отсчет, но доходность не заканчивается, когда обратный отсчет достигает 0. Обратный вызов происходит нормально, но context.cancel и context.abort, похоже, здесь тоже не помогают.

Могу ли я что-нибудь сделать, чтобы предотвратить зависание доходности или установить какое-то время ожидания, чтобы доходность в конечном итоге закончилась? Любая помощь / совет с благодарностью.

1 Ответ

0 голосов
/ 14 апреля 2020

Если кто-то еще сталкивался с этой проблемой, здесь действительно нет проблемы. Я ошибочно думал, что это блокировка, поскольку ни один из кодов, которые я вставил для печати, не печатал.

На самом деле, когда клиент отключается и сервер пытается выдать исключение, он выбрасывается ... это просто не общее "Исключение", "SystemExit" или "SystemError". Не совсем уверен, для чего предназначен тип исключения, но код завершает работу правильно, если вы выполняете необходимую очистку в "finally".

...