У меня есть задача 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