Ë
    LµCj  ã                   ó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Ø
‡K�KÐWÔXä×ÑÔÜ×ÑÔÜ×ÑÔÜ×ÑÔà
‡K�KÐ-Õ.ó    )Ú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'   