Длительное выполнение задачи Celery приводит к тому, что mysql 104 Connection reset by peer
В своем Django-приложении я использую celery для обработки очень длительных задач конвертации (кодирование видео, аудио и изображений). В целом все работает, как ожидалось, но иногда выполнение задачи занимает очень много времени (здесь речь идет о 6 часах или более). В самом конце каждой из этих задач конвертирования запускается операция обновления моей базы данных:
Files.objects.filter(pk=files_obj).update(...
И именно в этот момент моя задача celery обрывается с таким сообщением:
django.db.utils.OperationalError: (2006, "MySQL server has gone away (ConnectionResetError(104, 'Connection reset by peer'))")
>
Полную трассировку можно найти здесь: https://pastebin.com/qKB5KdpR
В настоящее время мой settings.py для соединений с базой данных выглядит следующим образом:
import pymysql
pymysql.install_as_MySQLdb()
...
# MySQL
DATABASES = {
'default': {
'ENGINE': 'django_prometheus.db.backends.mysql',
# 'ATOMIC_REQUESTS': True,
'STORAGE_ENGINE': 'InnoDB',
'CONN_MAX_AGE': 600,
'OPTIONS': {
'init_command': 'SET innodb_strict_mode=1',
'connect_timeout': 600,
'charset': 'utf8',
},
'NAME': env.str('MYSQL_DATABASE'),
'USER': env.str('MYSQL_USER'),
'PASSWORD': env.str('MYSQL_PASSWORD'),
'HOST': env.str('MYSQL_HOST'),
'PORT': env.str('MYSQL_PORT'),
}
}
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
...
Увеличение CONN_MAX_AGE или connect_timeout не имеет для меня особого смысла, так как задачи, которые выполняются всего 3 или 4 часа. обрабатываются нормально без такого поведения.
В настоящее время я предполагаю, что это поведение специфично для pymysql. Может быть, есть таймаут по умолчанию?
Заранее спасибо.