我正在使用 redis-py 2.10.6 和 redis 4.0.11。
我的应用程序将 redis 用于 db 和 pubsub。当我关闭时,我经常会挂起或崩溃。后者通常抱怨在处理 pubsub 回调时发生的文件描述符错误或文件上的 I/O 错误(我不使用任何错误),所以我猜测根本问题是相同的:不知何故我没有t 正确断开连接,并且我的 redis.Redis 对象使用的池还活着并且正在启动。
前一种错误的输出示例(在 _read_from_socket 期间):
redis.exceptions.ConnectionError:从套接字读取时出错:(9,'Bad file descriptor')
其他时候,stacktrace 清楚地显示 redis/connection.py -> redis/client.py -> threading.py,这证明 redis 没有杀死它使用的线程。
当我为我运行的应用程序加注星标时:
self.redis = redis.Redis(host=XXXX, port=XXXX)
self.pubsub = self.redis.pubsub()
subscriptions = {'chan1': self.cb1, 'chan2': self.cb2} # cb1 and cb2 are functions
self.pubsub.subscribe(**subscriptions)
self.pubsub_thread = self.pubsub.run_in_thread(sleep_time=1)
当我想退出应用程序时,我在main中执行的最后一条指令是使用类调用我的 redis 中的函数,其实现是:
self.pubsub.close()
self.pubsub_thread.stop()
self.redis.connection_pool.disconnect()
我的理解是,理论上我什至不需要做任何这些“关闭”电话,但是,无论有没有它们,我仍然不能保证完全关闭。
我的问题是,我应该如何保证彻底关机?