redis Python перехватывает исключение, которое не наследуется от BaseException - PullRequest
0 голосов
/ 26 мая 2020

Мы видим исключения в нашем журнале, например:

ERROR Exception ignored in: <function Connection.__del__ at 0x7f9b70a5cc20>
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.7/site-packages/redis/connection.py", line 537, in __del__
File "/app/.heroku/python/lib/python3.7/site-packages/redis/connection.py", line 667, in disconnect
TypeError: catching classes that do not inherit from BaseException is not allowed

Согласно исходному коду Redis оскорбительная строка - это except в следующем фрагменте:

try:
    if os.getpid() == self.pid:
        shutdown(self._sock, socket.SHUT_RDWR)
    self._sock.close()
except socket.error:
    pass

Это означает, что socket.exception не наследуется от BaseException. Однако, насколько я могу судить (на основе документации и метода класса mro), socket.exception наследует от BaseException.

Почему это происходит? Что я могу сделать, чтобы предотвратить это?

Кстати, наш код не вызывает Redis напрямую. Мы используем Redis Queue (rq), который реализован с помощью Redis.

1 Ответ

0 голосов
/ 01 июня 2020

Это могло бы произойти, если бы вы явно не закрыли клиент redis. Вот почему вы видели __del__ в трассировке.

Я не использую rq, но в качестве примера возьму сельдерей, но эту идею также можно применить к rq.

# tasks/__init__.py
from celeryapp import redis_client

@worker_shutdown.connect # this signal means it's about to shut down the worker
def cleanup(**kwargs):
    redis_client.close() # without this you may see error

# celeryapp.py
from celery import Celery
import redis

app = Celery(config_source="celeryconfig")
redis_client = redis.StrictRedis()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...