Dir*_*ich 6 redis python-3.x py-redis
我正在使用 redis-py 2.10.6 和 redis 4.0.11。
我的应用程序使用 redis 作为数据库和 pubsub。当我关闭时,我经常会遇到挂起或崩溃的情况。后者通常会抱怨处理 pubsub 回调时发生的错误文件描述符或文件上的 I/O 错误(我不使用任何错误),所以我猜测根本问题是相同的:不知何故我不'无法正确断开连接,并且我的 redis.Redis 对象使用的池处于活动状态。
前一种错误的输出示例(在 _read_from_socket 期间):
redis.exceptions.ConnectionError:从套接字读取时出错:(9,'错误文件描述符')
其他时候,堆栈跟踪清楚地显示 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)
Run Code Online (Sandbox Code Playgroud)
当我想退出应用程序时,我在main中执行的最后一条指令是调用我的 redis using 类中的函数,其实现是:
self.pubsub.close()
self.pubsub_thread.stop()
self.redis.connection_pool.disconnect()
Run Code Online (Sandbox Code Playgroud)
我的理解是,理论上我什至不需要执行任何这些“关闭”调用,但是,无论有或没有它们,我仍然无法保证彻底关闭。
我的问题是,我该如何保证干净关闭?
小智 0
我遇到了同样的问题,这很大程度上是由于 redis 库对关闭处理不当造成的。在清理期间,线程继续处理新消息,并且不考虑套接字不再可用的情况。在对代码进行了一些搜索之后,我找不到一种方法来阻止额外的处理而不只是等待。
由于这是在关闭阶段运行的,并且它是对第 3 方库的补救措施,因此我并不太担心sleep,但理想情况下应该更新该库以防止关闭时发生进一步的操作。
self.pubsub_thread.stop()
time.sleep(0.5)
self.pubsub.reset()
Run Code Online (Sandbox Code Playgroud)
这可能值得在redis-py库上写一个问题日志或 PR。
| 归档时间: |
|
| 查看次数: |
1217 次 |
| 最近记录: |