使用Google Cloud Pub/Sub取消订阅时遇指定RuntimeError错误
解决Google Cloud Pub/Sub取消订阅时的RuntimeError错误
你遇到的错误如下:
self = <google.cloud.pubsub_v1.SubscriberClient object at 0x000002069A31D820> def __enter__(self) -> "Client": if self._closed: > raise RuntimeError("Closed subscriber cannot be used as context manager.") E RuntimeError: Closed subscriber cannot be used as context manager. venv\lib\site-packages\google\cloud\pubsub_v1\subscriber\client.py:285: RuntimeError
问题核心是你复用的self.subscriber客户端已处于关闭状态,却仍在with语句中使用。with语法会在代码块执行完毕后自动调用客户端的close()方法,若后续再次使用这个已关闭的客户端进入with块,就会触发上述错误。
解决方案1:每次操作创建新客户端实例
如果不需要复用客户端,建议在调用取消订阅方法时每次创建新的SubscriberClient,配合with自动管理资源:
from google.cloud import pubsub_v1 def unsubscribe(self, subscription_id): # 每次调用创建新的客户端实例 subscriber = pubsub_v1.SubscriberClient() subscription_path = subscriber.subscription_path(self.project_id, subscription_id) with subscriber: subscriber.delete_subscription(request={"subscription": subscription_path}) return True
解决方案2:复用客户端并手动管理生命周期
如果需要复用self.subscriber,则不要用with语句包裹,手动控制客户端的生命周期:
def unsubscribe(self, subscription_id): subscriber = self.subscriber # 检查客户端是否已关闭,若关闭则重新初始化 if subscriber._closed: subscriber = pubsub_v1.SubscriberClient() self.subscriber = subscriber subscription_path = subscriber.subscription_path(self.project_id, subscription_id) subscriber.delete_subscription(request={"subscription": subscription_path}) # 若后续不再使用该客户端,可手动执行关闭 # subscriber.close() return True
内容的提问来源于stack exchange,提问作者Dshiz
相关产品推荐
相关产品推荐

