Параметр Celery max_tasks_per_child не перезапускает рабочий

#python #multiprocessing #celery

#python #многопроцессорная обработка #сельдерей

Вопрос:

Сбой как в Celery 4.4.7, так и в 5.0.2.

Моя задача — утечка значительного объема памяти. Я бы хотел перезапускать worker после каждой задачи. Я запускаю сельдерей в режиме без параллелизма --concurrency=1 или / и -P solo , поскольку память, используемая в одной задаче, может быть близка к общей системной памяти.

Я попытался установить worker_max_tasks_per_child = 1 в celeryconfig.py и --max-tasks-per-child=1 в CLI, но рабочий не перезапускается.

Комментарии:

1. Этот параметр настраивает Celery worker не на перезапуск, а на создание нового рабочего процесса после N задач. Я предполагаю, что поведение также зависит от типа используемого вами параллелизма…

2. Параллелизма нет. Процесс большой и требует графического процессора. Итак --concurrency 1 -P solo

3. До сих пор я никогда не использовал solo … С параллелизмом предварительной обработки он работает так, как ожидалось. Возможно, в вашем случае это обрабатывается по-другому. Я бы предположил, что в solo нет рабочих процессов, поэтому worker_max_tasks_per_child игнорируется, так как, угадайте, что «дочернего» процесса нет! 🙂 Попробуйте без использования соло и параллелизма, установленного на 1. Это почти то же самое.

Ответ №1:

Я почти уверен, что рабочие celery не завершаются после завершения задачи. Я бы попробовал использовать sys.exit в конце вашей задачи, таким образом, процесс завершится, и systemd или любая другая служба, отвечающая за ваши процессы, вернет его обратно.

Но реальным решением должно быть написание кода без утечек памяти

Ответ №2:

В вашем случае этот параметр не выполняется, поскольку вы указали конфигурацию пула вашего рабочего как «solo». Это работает, только если ваша конфигурация «предварительная». Если вы запустите рабочий с измененной конфигурацией, вы сможете увидеть изменения. Я использовал эту опцию для предотвращения проблемы с утечкой памяти в tensorflow, поскольку он не возвращает зарезервированную память до завершения процесса, что было большой проблемой в моем приложении. Я также не понимал, почему этот параметр не работает, пока не увидите ограничение по ссылке.