
    `f                     B   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j                            dd                    Z G d de	j                  Z G d de          ZdS )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                   8    e Zd ZdZdZdZefZd Zd Z	d Z
d ZdS )	r   z?Bootstep that starts the autoscaler thread/timer in the worker.r   Tc                 ,    |j         | _        d |_        d S N)	autoscaleenabled
autoscaler)selfwkwargss      I/var/www/html/env/lib/python3.11/site-packages/celery/worker/autoscale.py__init__zWorkerComponent.__init__&   s    {    c           	          |                      |j        |j        |j        |j        ||j        rt                      nd           x}|_        |j        s|nd S )N)workermutex)instantiateautoscaler_clspoolmax_concurrencymin_concurrencyuse_eventloopr   r   )r   r   scalers      r   createzWorkerComponent.create*   sa     $ 0 0FA%q'81?DIKKK !1 !
 !
 	

 _6vv$6r   c                     |j         j                            |j        j                   |                    |j        j        |j        j                   d S r   )consumeron_task_messageaddr   maybe_scalecall_repeatedly	keepalive)r   r   hubs      r   register_with_event_loopz(WorkerComponent.register_with_event_loop2   sQ    	
"&&q|'?@@@L"AL$<	
 	
 	
 	
 	
r   c                 8    d|j                                         iS )zReturn `Autoscaler` info.r   )r   info)r   r   s     r   r1   zWorkerComponent.info8   s    al//1122r   N)__name__
__module____qualname____doc__labelconditionalr   requiresr   r&   r/   r1    r   r   r   r      sg        IIEKwH  7 7 7
 
 
3 3 3 3 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                                                       || _        |pt          j                    | _        || _        || _        || _        d | _	        || _
        | j        s
J d            d S )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__@   sx     		.in..
..""~<<<<<~<<r   c                     | j         5  |                                  d d d            n# 1 swxY w Y   t          d           d S )Ng      ?)r   r+   r   r   s    r   bodyzAutoscaler.bodyN   s    Z 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	c




s   )--c                     | j         }t          | j        | j                  }||k    r|                     ||z
             dS t          | j        | j                  }||k     r|                     ||z
             dS d S )NT)	processesminqtyr"   scale_upmaxr#   
scale_down)r   reqprocscurs       r   _maybe_scalezAutoscaler._maybe_scaleS   s    $(D011;;MM#+&&&4$(D011;;OOECK(((4 ;r   c                 f    |                      |          r| j                                         d S d S r   )rN   r!   maintain_pool)r   rK   s     r   r+   zAutoscaler.maybe_scale^   s<    S!! 	&I##%%%%%	& 	&r   c                 N   | j         5  |D|| j        k     r|                     | j        |z
             |                     |           || _        |/|| j        k    r|                     || j        z
             || _        | j        | j        fcd d d            S # 1 swxY w Y   d S r   )r   rE   _shrink_update_consumer_prefetch_countr"   _growr#   )r   rI   rF   s      r   updatezAutoscaler.updateb   s    Z 
	> 
	>''LL#!566644S999'*$''JJsT^3444'*$')==
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	>s   BBB!Bc                 R    t                      | _        |                     |          S r   )r   r?   rT   r   ns     r   rH   zAutoscaler.scale_upo   s    'kkzz!}}r   c                     | j         r4t                      | j         z
  | j        k    r|                     |          S d S d S r   )r?   r   r-   rR   rW   s     r   rJ   zAutoscaler.scale_downs   sF     	#d11DNBB<<??"	# 	#BBr   c                 Z    t          d|           | j                            |           d S )NzScaling up %s processes.)r1   r!   growrW   s     r   rT   zAutoscaler._growx   s-    '+++	qr   c                     t          d|           	 | j                            |           d S # t          $ r t	          d           Y d S t
          $ r}t          d|d           Y d }~d S 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|   s    )1---	DIQ 	F 	F 	FDEEEEEE 	D 	D 	D.dCCCCCCCCCC	Ds   . A0
	A0A++A0c                 `    || j         z
  }|r!| j        j                            |           d S d S r   )r"   r   r(   _update_prefetch_count)r   new_maxdiffs      r   rS   z*Autoscaler._update_consumer_prefetch_count   sK    -- 	K 77    	 	r   c                 8    | j         | j        | j        | j        dS )N)rI   rF   currentrG   )r"   r#   rE   rG   rB   s    r   r1   zAutoscaler.info   s'    ''~8	
 
 	
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    y&&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   =   s-       66 "#4.d= = = = = =  
	 	 	 	& & & &> > > >  # # #
  D D D  
 
 
 , , X, ' ' X' ' ' ' '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 2 2 2 2 2       ' ' ' ' ' ' ) ) ) ) ) )            
+	H		\6; tUeBJNN+@"EEFF 3 3 3 3 3i- 3 3 3<]' ]' ]' ]' ]' ]' ]' ]' ]' ]'r   