
    h                     R   d Z ddlZddl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 dd	lmZ dd
lmZ dZ ee      Zej*                  ej,                  ej.                  cZZZ eej2                  j5                  dd            Z G d de	j8                        Z G d de      Zy)zPool Autoscaling.

This module implements the internal thread responsible
for growing and shrinking the pool according to the
current autoscale settings.

The autoscale thread is only enabled if
the :option:`celery worker --autoscale` option is used.
    N)	monotonicsleep)	DummyLock)	bootsteps)
get_logger)bgThread   )state)Pool)
AutoscalerWorkerComponentAUTOSCALE_KEEPALIVE   c                   6    e Zd ZdZdZdZefZd Zd Z	d Z
d Zy)	r   z?Bootstep that starts the autoscaler thread/timer in the worker.r   Tc                 4    |j                   | _        d |_        y N)	autoscaleenabled
autoscaler)selfwkwargss      S/var/www/Befach/backend/env/lib/python3.12/site-packages/celery/worker/autoscale.py__init__zWorkerComponent.__init__&   s    {{    c           	          | j                  |j                  |j                  |j                  |j                  ||j
                  r
t               nd       x}|_        |j
                  s|S d S )N)workermutex)instantiateautoscaler_clspoolmax_concurrencymin_concurrencyuse_eventloopr   r   )r   r   scalers      r   createzWorkerComponent.create*   sb     $ 0 0FFA%%q'8'81??IK !1 !
 	

 __v6$6r   c                     |j                   j                  j                  |j                  j                         |j                  |j                  j                  |j                  j                         y r   )consumeron_task_messageaddr   maybe_scalecall_repeatedly	keepalive)r   r   hubs      r   register_with_event_loopz(WorkerComponent.register_with_event_loop2   sK    	

""&&q||'?'?@LL""ALL$<$<	
r   c                 :    d|j                   j                         iS )zReturn `Autoscaler` info.r   )r   info)r   r   s     r   r1   zWorkerComponent.info8   s    all//122r   N)__name__
__module____qualname____doc__labelconditionalr   requiresr   r&   r/   r1    r   r   r   r      s*    IEKwH7
3r   r   c                        e Zd ZdZddedf fd	Zd ZddZddZddZ	d	 Z
d
 Zd Zd Zd Zd Zed        Zed        Z xZS )r   z,Background thread to autoscale pool workers.r   Nc                     t         |           || _        |xs t        j                         | _        || _        || _        || _        d | _	        || _
        | j                  sJ d       y )Nzcannot scale down too fast.)superr   r!   	threadingLockr   r"   r#   r-   _last_scale_upr   )r   r!   r"   r#   r   r-   r   	__class__s          r   r   zAutoscaler.__init__@   sb     		.inn.
..""~~<<<~r   c                 |    | j                   5  | j                          d d d        t        d       y # 1 sw Y   xY w)Ng      ?)r   r+   r   r   s    r   bodyzAutoscaler.bodyN   s1    ZZ 		c
	 	s   2;c                    | j                   }t        | j                  | j                        }||kD  r| j	                  ||z
         yt        | j                  | j                        }||k  r| j                  ||z
         yy )NT)	processesminqtyr"   scale_upmaxr#   
scale_down)r   reqprocscurs       r   _maybe_scalezAutoscaler._maybe_scaleS   sp    $((D001;MM#+&$((D001;OOECK( r   c                 \    | j                  |      r| j                  j                          y y r   )rN   r!   maintain_pool)r   rK   s     r   r+   zAutoscaler.maybe_scale^   s%    S!II##% "r   c                 p   | j                   5  |E|| j                  k  r| j                  | j                  |z
         | j                  |       || _        |4|| j                  kD  r| j                  || j                  z
         || _        | j                  | j                  fcd d d        S # 1 sw Y   y xY wr   )r   rE   _shrink_update_consumer_prefetch_countr"   _growr#   )r   rI   rF   s      r   updatezAutoscaler.updateb   s    ZZ 
	>'LL#!5644S9'*$'JJsT^^34'*$'')=)==
	> 
	> 
	>s   BB,,B5c                 B    t               | _        | j                  |      S r   )r   r?   rT   r   ns     r   rH   zAutoscaler.scale_upo   s    'kzz!}r   c                     | j                   r6t               | j                   z
  | j                  kD  r| j                  |      S y y r   )r?   r   r-   rR   rW   s     r   rJ   zAutoscaler.scale_downs   s=    d111DNNB<<?" C r   c                 R    t        d|       | j                  j                  |       y )NzScaling up %s processes.)r1   r!   growrW   s     r   rT   zAutoscaler._growx   s    '+		qr   c                     t        d|       	 | j                  j                  |       y # t        $ r t	        d       Y y t
        $ r}t        d|d       Y d }~y d }~ww xY w)NzScaling down %s processes.z0Autoscaler won't scale down: all processes busy.zAutoscaler: scale_down: %rT)exc_info)r1   r!   shrink
ValueErrordebug	Exceptionerror)r   rX   excs      r   rR   zAutoscaler._shrink|   sY    )1-	DIIQ 	FDE 	D.dCC	Ds   * A  A AA c                 r    || j                   z
  }|r&| j                  j                  j                  |       y y r   )r"   r   r(   _update_prefetch_count)r   new_maxdiffs      r   rS   z*Autoscaler._update_consumer_prefetch_count   s5    ---KK  77 r   c                 `    | j                   | j                  | j                  | j                  dS )N)rI   rF   currentrG   )r"   r#   rE   rG   rB   s    r   r1   zAutoscaler.info   s,    ''''~~88	
 	
r   c                 4    t        t        j                        S r   )lenr
   reserved_requestsrB   s    r   rG   zAutoscaler.qty   s    5**++r   c                 .    | j                   j                  S r   )r!   num_processesrB   s    r   rE   zAutoscaler.processes   s    yy&&&r   r   )NN)r2   r3   r4   r5   r   r   rC   rN   r+   rU   rH   rJ   rT   rR   rS   r1   propertyrG   rE   __classcell__)r@   s   @r   r   r   =   sr    6 "#4.d=
	&>#
D
 , , ' 'r   r   )r5   osr=   timer   r   kombu.asynchronous.semaphorer   celeryr   celery.utils.logr   celery.utils.threadsr    r
   
componentsr   __all__r2   loggerr`   r1   rb   floatenvirongetr   StartStopStepr   r   r9   r   r   <module>r      s    
  ! 2  ' )  
+	H	\\6;; tUBJJNN+@"EF 3i-- 3<]' ]'r   