服务器流响应时python gRPC客户端断开连接

时间:2020-04-09 14:32:08

标签: python stream grpc yield

美好的一天,

这是我的第一次发帖,如果我对发帖做错了,请原谅。 我正在尝试运行订阅类型服务,该服务可以正常工作,直到客户端断开连接为止。根据时间的不同,它可以正常工作或无限期阻塞。

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")

我是gRPC的新手,所以可能有些地方我做错了,但是我的主要问题是,如果客户端在产生收益之前/期间断开连接,则代码会无限期地挂起。我已经尝试了一些方法来摆脱这种情况,但是它们只能工作几次。在客户端设置的超时不会倒计时,但是当倒计时达到0时收益不会结束。回调发生得很好,但是context.cancel和context.abort似乎也无济于事。

我有什么办法可以防止收益率挂起或设置某种超时,以使收益率最终终止?任何帮助/建议,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果其他任何人遇到此问题,则这里实际上没有问题。我错误地认为这是阻塞的,因为我在打印进程中输入的代码都没有打印。

实际上,当客户端断开连接并且服务器尝试产生异常时……它不是一般的“异常”,“ SystemExit”或“ SystemError”。不能完全确定为此使用什么异常类型,但是如果您在“ finally”中执行所需的任何清理操作,则代码会正确退出。