
    LCj                     x   d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZ ddlmZ dd	lmZ  e       Z ed
ej&                  ej(                        Zej,                  j/                  ddgdddej0                  ej2                  dddd       ej5                  dg       ej6                  dd       Zy)up  
Celery application instance.

This is the entry point for `celery -A app.workers.celery_app worker`.
Each worker process, when it starts, loads all 6 ML models into its own
memory ONCE (via the worker_process_init signal below) — not per task.
This is what makes scaling workers horizontally cheap: spin up more
processes, each pays the model-loading cost once at boot, then serves
many tasks from warm memory.

Separating these workers from the Gunicorn/Uvicorn web workers means ML
load (CPU-bound, multi-second) never competes with or blocks web request
handling (I/O-bound, sub-100ms for everything except /analyze).
    )Celery)worker_process_init)get_settings)
get_loggersetup_logging)model_registry)feature_builder)llm_service)reference_datacrop_ai_worker)brokerbackendjsonUTCT      )task_serializeraccept_contentresult_serializertimezone
enable_utctask_time_limittask_soft_time_limitworker_prefetch_multiplierworker_max_tasks_per_childtask_acks_latetask_reject_on_worker_lostzapp.workersNc                     t                t        d      }|j                  d       t        j                          t        j                          t        j                          t        j                          |j                  d       y)u   
    Runs once per worker process at startup, before it accepts any tasks.
    If this raises, the worker process fails to start — which is correct:
    a worker with no models loaded must never silently pick up analysis jobs.
    zcelery.worker_initzEInitializing Celery worker process: loading models and reference datazCelery worker process readyN)
r   r   infor   loadr	   r   load_allr
   init)kwargsloggers     CC:\Crop_Prediction\Backend\crop-ai-system\app\workers\celery_app.pyinit_workerr&   9   s^     O,-F
KKWX
KK-.    )returnN)__doc__celeryr   celery.signalsr   app.core.configr   app.core.logging_configr   r   app.models_loader.registryr   app.services.feature_builderr	   app.services.llm_servicer
   app.services.reference_datar   settingsCELERY_BROKER_URLCELERY_RESULT_BACKEND
celery_appconfupdateCELERY_TASK_TIME_LIMITCELERY_TASK_SOFT_TIME_LIMITautodiscover_tasksconnectr&    r'   r%   <module>r=      s     . ( = 5 8 0 6>%%**
   833!==   #   $#  (   }o . / /r'   