#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, поскольку он не возвращает зарезервированную память до завершения процесса, что было большой проблемой в моем приложении. Я также не понимал, почему этот параметр не работает, пока не увидите ограничение по ссылке.