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



你好,

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

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.cocancel和context.abort在这里似乎也没有帮助。

我能做些什么来防止收益挂起或设置某种超时以使收益最终结束吗?非常感谢任何帮助/建议。

如果其他人遇到这个问题,那么这里并没有什么问题。我错误地认为这是阻塞,因为我为打印进度而输入的代码都没有打印出来。

事实上,当客户端断开连接,服务器试图产生异常时,会抛出。。。它不是一般的"异常"、"系统退出"或"系统错误"。不完全确定异常类型是什么,但如果在"finally"中执行所需的任何清理,代码确实会正确退出。

您可以使用GeneratorExit异常捕获它

def Subscribe(self, request, context):
try:
words = ["Please", "help", "me", "solve", "my", "problem", "!"] 
while context.is_active():
for word in words:
event = fr_pb2.Event(word=word)
if not context.is_active():
break
yield event
print (event)                    
except GeneratorExit:
print("Client disconnected before function finished!")
finally:
print("Subscribe ended")

当客户端在gRPC函数过程中断开连接时,它将在服务器端引发GeneratorExit异常。默认情况下,它无法捕获Exception。

最新更新