Celery SoftTimeLimitExceeded не перехвачен при выполнении транзакции БД - PullRequest
1 голос
/ 31 октября 2019

У меня есть задача celery, которая запускается с soft_time_limit.

вся логика задачи окружена попыткой, кроме SoftTimeLimitExceeded.

При просмотре журналов я вижучто сельдерей записал в журналы

some_log.log:58232:[2019-10-31 09:19:48,794] [WARNING] [module: job] [logger: celery.worker.job]: Soft time limit (4s) exceeded for project.tasks.some_task[168a4c38-5672-483b-b3cc-dd7c35d85b93] some_log.log:58235:[2019-10-31 09:19:48,939] [ERROR] [module: base] [logger: sentry.errors.uncaught]: [u'Soft time limit (4s) exceeded for project.tasks.some_task[168a4c38-5672-483b-b3cc-dd7c35d85b93]']

Я использую:

сельдерей == 3.1.15

django-celery == 3.1.1

MySQL-python == 1.2.5

Python 2.7.16

Mysql 5.7

Задача выглядит примерно так:

@task(soft_time_limit=4)
def some_task(self, *args, **kwargs):
    try:
        with MySQLdb.connect(host=host, port=port,
                             user=user, passwd=password,
                             db=name, local_infile=1, autocommit=False) as cursor:
            cursor.execute("update ....")
    except SoftTimeLimitExceeded:
    # handle

Я попытался применить обработчик ошибок к соединению и к курсору, чтобы вызвать исключение, но все равно не повезло.

Похоже, что процесс просто завершается, даже не вызывая исключение.

Одна вещь, которую я попробовал, это запустить новый поток, который задерживает задачи и ждет его завершения.

Поток просто окружил задержку попыткой, за исключением SoftTimeLimitExceeded и выполнил get () с задержкой.

Этот поток смог отловить исключение из задачи.

def thread_delay(*args, **kwargs):
    try:
        some_task.delay(args, kwargs).get()
    except SoftTimeLimitExceeded:
    # Handle
...