Spaces:
Running
Running
| """Celery Application configuration for asynchronous background worker jobs.""" | |
| from __future__ import annotations | |
| import logging | |
| import os | |
| from celery import Celery | |
| logger = logging.getLogger(__name__) | |
| REDIS_URL = os.getenv("REDIS_URL") or os.getenv("CELERY_BROKER_URL") or "redis://localhost:6379/0" | |
| celery_app = Celery( | |
| "mathsolver_worker", | |
| broker=REDIS_URL, | |
| backend=REDIS_URL, | |
| include=["app.tasks"], | |
| ) | |
| celery_app.conf.update( | |
| task_serializer="json", | |
| accept_content=["json"], | |
| result_serializer="json", | |
| timezone="UTC", | |
| enable_utc=True, | |
| task_track_started=True, | |
| task_time_limit=900, # 15 minutes max | |
| task_soft_time_limit=840, | |
| worker_prefetch_multiplier=1, | |
| worker_concurrency=int(os.getenv("CELERY_CONCURRENCY", "4")), | |
| task_acks_late=True, | |
| task_reject_on_worker_lost=True, | |
| ) | |
| def is_celery_available() -> bool: | |
| """ | |
| Check if Celery / Redis broker is configured and reachable. | |
| Returns False when running in minimal dev/test environments without Redis. | |
| """ | |
| disable_celery = os.getenv("DISABLE_CELERY", "0").lower() in ("1", "true", "yes") | |
| if disable_celery: | |
| return False | |
| try: | |
| import redis | |
| client = redis.from_url(REDIS_URL, socket_connect_timeout=0.5, socket_timeout=0.5) | |
| client.ping() | |
| return True | |
| except Exception: | |
| return False | |