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