"""Celery app factory.""" from celery import Celery from ..core.config import settings def _broker_url() -> str: return settings.celery.broker_url or settings.redis.url def _result_backend() -> str: return settings.celery.result_backend or settings.redis.url celery_app = Celery( "iaai_scraper", broker=_broker_url(), backend=_result_backend(), ) celery_app.conf.update( # Сериализация. task_serializer="json", accept_content=["json"], result_serializer="json", timezone="UTC", enable_utc=True, # Лимиты. task_soft_time_limit=settings.celery.task_soft_time_limit, task_time_limit=settings.celery.task_time_limit, worker_concurrency=settings.celery.worker_concurrency, # Playwright sync API: prefork + 1 процесс. worker_pool="prefork", worker_prefetch_multiplier=1, # Retry policy брокера. broker_connection_retry_on_startup=True, # Beat schedule. beat_schedule={ "periodic-sync-listing": { "task": "iaai_scraper.worker.tasks.sync_listing_task", "schedule": settings.celery.beat_sync_interval_minutes * 60.0, "args": (), "kwargs": {"limit": settings.celery.beat_sync_limit}, "options": {"queue": "scraping"}, }, }, # Роутинг задач. task_routes={ "iaai_scraper.worker.tasks.*": {"queue": "scraping"}, }, ) # Автообнаружение задач. celery_app.autodiscover_tasks(["iaai_scraper.worker"])