Я создаю приложение celery + django + selenium. Я запускаю браузеры на основе селена в отдельных процессах с помощью сельдерея. Версии:
celery==5.2.6
redis==3.4.1
selenium-wire==5.1.0
Django==4.0.4
djangorestframework==3.13.1
Я обнаружил, что через несколько часов приложение генерирует тысячи процессов-зомби. Также выяснилось, что проблема связана с контейнером докеров сельдерея, потому что после sudo /usr/local/bin/docker-compose -f /data/new_app/docker-compose.yml перезапустить сельдерей у меня 0 зомби процессы.
Мой код
from rest_framework.decorators import api_view
@api_view(['POST'])
def periodic_check_all_urls(request): # web-service endpoint
...
check_urls.delay(parsing_results_ids) # call celery task
Код задачи «Сельдерей»
from celery import shared_task
@shared_task()
def check_urls(parsing_result_ids: List[int]):
"""
Run Selenium-based parser
the parser exctracts data and saves in database
"""
try:
logger.info(f"{datetime.now()} Start check_urls")
parser = Parser() # open selenium browser
parsing_results = ParsingResult.objects.filter(pk__in=parsing_result_ids).exclude(status__in=["DONE", "FAILED"])
parser.check_parsing_result(parsing_results)
except Exception as e:
full_trace = traceback.format_exc()
finally:
if 'parser' in locals():
parser.stop()
Функция остановки браузера Selenium и деструктор
class Parser():
def __init__(self):
"""
Prepare parser
"""
if not USE_GUI:
self.display = Display(visible=0, size=(800, 600))
self.display.start()
""" Replaced with FireFox
self.driver = get_chromedriver(proxy_data)
"""
proxy_data = {
...
}
self.driver = get_firefox_driver(proxy_data=proxy_data)
def __del__(self):
self.stop()
def stop(self):
try:
self.driver.quit()
logger.info("Selenium driver closed")
except:
pass
try:
self.display.stop()
logger.info("Display stopped")
except:
pass
Также я пробовал несколько настроек, чтобы ограничить ресурсы задачи сельдерея и время работы (с зомби-процессами это не помогло)
Мои настройки сельдерея в dgango settings.py
# celery setting (documents generation)
CELERY_BROKER_URL = os.environ.get("CELERY_BROKER", "redis://redis:6379/0")
CELERY_RESULT_BACKEND = os.environ.get("CELERY_BROKER", "redis://redis:6379/0")
CELERY_IMPORTS = ("core_app.celery",)
CELERY_TASK_TIME_LIMIT = 10 * 60
Мои настройки сельдерея в докерах
celery:
build: ./project
command: celery -A core_app worker --loglevel=info --concurrency=15 --max-memory-per-child=1000000
volumes:
- ./project:/usr/src/app
- ./project/media:/project/media
- ./project/logs:/project/logs
env_file:
- .env
environment:
# environment variables declared in the environment section override env_file
- DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
- CELERY_BROKER=redis://redis:6379/0
- CELERY_BACKEND=redis://redis:6379/0
depends_on:
- django
- redis
Я читаю Django/Celery. Как завершить задачу сельдерея? но это не помогло
Также прочитайте Celery отозвать, оставив зомби-процесс ffmpeg, но моя задача уже содержит try/Exception
Пример процессов-зомби
Пример процессов-зомби
р>
ps aux | grep 'Z'
root 32448 0.0 0.0 0 0 ? Z 13:45 0:00 [Utility Process]
root 32449 0.0 0.0 0 0 ? Z 13:09 0:00 [Utility Process]
root 32450 0.0 0.0 0 0 ? Z 11:13 0:00 [sh]
root 32451 0.0 0.0 0 0 ? Z 13:44 0:00 [Utility Process]
root 32452 0.0 0.0 0 0 ? Z 10:12 0:00 [Utility Process]
root 32453 0.0 0.0 0 0 ? Z 09:52 0:00 [sh]
root 32454 0.0 0.0 0 0 ? Z 10:40 0:00 [Utility Process]
root 32455 0.0 0.0 0 0 ? Z 09:52 0:00 [Utility Process]
root 32456 0.0 0.0 0 0 ? Z 10:13 0:00 [sh]
root 32457 0.0 0.0 0 0 ? Z 10:51 0:00 [Utility Process]
root 32459 0.0 0.0 0 0 ? Z 14:01 0:00 [Utility Process]
root 32460 0.0 0.0 0 0 ? Z 13:16 0:00 [Utility Process]
root 32461 0.0 0.0 0 0 ? Z 10:40 0:00 [Utility Process]
root 32462 0.0 0.0 0 0 ? Z 10:12 0:00 [Utility Process]
Подробнее здесь: https://stackoverflow.com/questions/792 ... -processes
Как очистить ресурсы задач и процессы-зомби ⇐ Python
Программы на Python
-
Anonymous
1734519860
Anonymous
Я создаю приложение celery + django + selenium. Я запускаю браузеры на основе селена в отдельных процессах с помощью сельдерея. Версии:
celery==5.2.6
redis==3.4.1
selenium-wire==5.1.0
Django==4.0.4
djangorestframework==3.13.1
Я обнаружил, что через несколько часов приложение генерирует тысячи процессов-зомби. Также выяснилось, что проблема связана с контейнером докеров сельдерея, потому что после sudo /usr/local/bin/docker-compose -f /data/new_app/docker-compose.yml перезапустить сельдерей у меня 0 зомби процессы.
Мой код
from rest_framework.decorators import api_view
@api_view(['POST'])
def periodic_check_all_urls(request): # web-service endpoint
...
check_urls.delay(parsing_results_ids) # call celery task
Код задачи «Сельдерей»
from celery import shared_task
@shared_task()
def check_urls(parsing_result_ids: List[int]):
"""
Run Selenium-based parser
the parser exctracts data and saves in database
"""
try:
logger.info(f"{datetime.now()} Start check_urls")
parser = Parser() # open selenium browser
parsing_results = ParsingResult.objects.filter(pk__in=parsing_result_ids).exclude(status__in=["DONE", "FAILED"])
parser.check_parsing_result(parsing_results)
except Exception as e:
full_trace = traceback.format_exc()
finally:
if 'parser' in locals():
parser.stop()
Функция остановки браузера Selenium и деструктор
class Parser():
def __init__(self):
"""
Prepare parser
"""
if not USE_GUI:
self.display = Display(visible=0, size=(800, 600))
self.display.start()
""" Replaced with FireFox
self.driver = get_chromedriver(proxy_data)
"""
proxy_data = {
...
}
self.driver = get_firefox_driver(proxy_data=proxy_data)
def __del__(self):
self.stop()
def stop(self):
try:
self.driver.quit()
logger.info("Selenium driver closed")
except:
pass
try:
self.display.stop()
logger.info("Display stopped")
except:
pass
Также я пробовал несколько настроек, чтобы ограничить ресурсы задачи сельдерея и время работы (с зомби-процессами это не помогло)
Мои настройки сельдерея в dgango settings.py
# celery setting (documents generation)
CELERY_BROKER_URL = os.environ.get("CELERY_BROKER", "redis://redis:6379/0")
CELERY_RESULT_BACKEND = os.environ.get("CELERY_BROKER", "redis://redis:6379/0")
CELERY_IMPORTS = ("core_app.celery",)
CELERY_TASK_TIME_LIMIT = 10 * 60
Мои настройки сельдерея в докерах
celery:
build: ./project
command: celery -A core_app worker --loglevel=info --concurrency=15 --max-memory-per-child=1000000
volumes:
- ./project:/usr/src/app
- ./project/media:/project/media
- ./project/logs:/project/logs
env_file:
- .env
environment:
# environment variables declared in the environment section override env_file
- DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
- CELERY_BROKER=redis://redis:6379/0
- CELERY_BACKEND=redis://redis:6379/0
depends_on:
- django
- redis
Я читаю Django/Celery. Как завершить задачу сельдерея? но это не помогло
Также прочитайте Celery отозвать, оставив зомби-процесс ffmpeg, но моя задача уже содержит try/Exception
Пример процессов-зомби
Пример процессов-зомби
р>
ps aux | grep 'Z'
root 32448 0.0 0.0 0 0 ? Z 13:45 0:00 [Utility Process]
root 32449 0.0 0.0 0 0 ? Z 13:09 0:00 [Utility Process]
root 32450 0.0 0.0 0 0 ? Z 11:13 0:00 [sh]
root 32451 0.0 0.0 0 0 ? Z 13:44 0:00 [Utility Process]
root 32452 0.0 0.0 0 0 ? Z 10:12 0:00 [Utility Process]
root 32453 0.0 0.0 0 0 ? Z 09:52 0:00 [sh]
root 32454 0.0 0.0 0 0 ? Z 10:40 0:00 [Utility Process]
root 32455 0.0 0.0 0 0 ? Z 09:52 0:00 [Utility Process]
root 32456 0.0 0.0 0 0 ? Z 10:13 0:00 [sh]
root 32457 0.0 0.0 0 0 ? Z 10:51 0:00 [Utility Process]
root 32459 0.0 0.0 0 0 ? Z 14:01 0:00 [Utility Process]
root 32460 0.0 0.0 0 0 ? Z 13:16 0:00 [Utility Process]
root 32461 0.0 0.0 0 0 ? Z 10:40 0:00 [Utility Process]
root 32462 0.0 0.0 0 0 ? Z 10:12 0:00 [Utility Process]
Подробнее здесь: [url]https://stackoverflow.com/questions/79277584/how-to-clear-task-resources-and-zombie-processes[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия