mascai
mascai

Reputation: 1892

Celery task (process) is not closed

I am running the following infrastructure: Celery starts Selenium-based browsers in separate tasks

I noticed (with help of htop )that I have tens of unclosed celery processes with firefox-esr and /usr/local/bin/python3.9 /usr/local/bin/celery -A core_app worker ...

enter image description here

How to properly close celery tasks?

My infrastructure in docker-compose.yaml:

version: '3.3'

services:
  django:
    image: harbor.mgns-tech.ru/content-protect/main-app:latest
    command: sh -c "
      sleep 3 && gunicorn --bind 0.0.0.0:8000 core_app.wsgi"
    volumes:
      - ./project/static:/project/static
      - ./project/media:/project/media
      - ./project/logs:/project/logs
    expose:
      - 8000
    env_file:
      - ./.env
    depends_on:
      - db


  db:
    image: postgres:13-alpine
    volumes:
      - pg_data:/var/lib/postgresql/data/
    expose:
      - 5432
    ports:
      - "5433:5432"
    env_file:
      - .env
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=${DB_NAME}

  nginx:
    image: nginx:1.24.0-alpine
    depends_on:
      - django
    env_file:
      - ./.env
    ports:
      - "80:80"
    volumes:
      - ./project/static:/var/www/html/static
      - ./project/media:/var/www/html/media
      - ./project/nginx-conf.d/:/etc/nginx/conf.d

  celery:
    image: harbor.mgns-tech.ru/content-protect/main-app:latest
    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


  celery-flower:
    image: harbor.mgns-tech.ru/content-protect/main-app:latest
    restart: always
    command: celery -A core_app flower --loglevel=INFO --port=9090
    ports:
      - "9090:9090"
    env_file:
      - .env
    depends_on:
      - django
      - redis


  redis:
    image: redis:5-alpine
    volumes:
      - ./project:/usr/src/app
      - ./project/media:/project/media
      - ./project/logs:/project/logs
      - ./redis-data:/data
    ports:
     - "6379:6379"
    sysctls:
      - net.core.somaxconn=65535

Example of celery task

@shared_task()
def check_urls(parsing_result_ids: List[int]):
    """
    Run Selenium-based yandex parser
    the parser exctracts data and saves in database
    """
    try:
        logger.info(f"{datetime.now()} Start check_urls")
        parser = YandexParser() # Selenium object
        parsing_results = ParsingResult.objects.filter(pk__in=parsing_result_ids).exclude(status="DONE")
        logger.info(f"{datetime.now()} Start check_urls: {len(parsing_results)} urls")

        parser.check_parsing_result(parsing_results)

        logger.info(f"{datetime.now()} Stop check_urls")
    except Exception as e:
        full_trace = traceback.format_exc()
        logger.info(f"Exception in check urls task: {full_trace}")
    finally:
        if 'parser' in locals():
            parser.stop() # stops selenium

Upvotes: 0

Views: 13

Answers (0)

Related Questions