Ë
    ™V.jñ  ã                   ó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)zûPool 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      úYC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\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Ø×ÑØ�F‰F�A×%Ñ% q×'8Ñ'8Ø¨1¯?ª?œIœKÀð !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§|¡|×'?Ñ'?Ô@Ø×ÑØ�L‰L×"Ñ" A§L¡L×$<Ñ$<õ	
r   c                 ó:   — d|j                   j                  «       iS )zReturn `Autoscaler` info.r   )r   Úinfo)r   r   s     r   r1   zWorkerComponent.info8   s   € à˜aŸl™l×/Ñ/Ó1Ð2Ð2r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚlabelÚconditionalr   Úrequiresr   r&   r/   r1   © r   r   r   r      s*   „ ÙIà€EØ€KØˆw€Hòò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   ø€ ô 	‰ÑÔØˆŒ	ØÒ.œiŸn™nÓ.ˆŒ
Ø.ˆÔØ.ˆÔØ"ˆŒØ"ˆÔØˆŒà�~Š~Ð<Ð<Ó<‰~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   s)   € Ø�Z‹ZØ×ÑÔ÷ äˆc�
÷ ˆZú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ˆØ�Š;Ø�M‰M˜# ™+Ô&ØÜ�$—(‘(˜D×0Ñ0Ó1ˆØ�Š;Ø�O‰O˜E C™KÔ(Øð r   c                 ó\   — | j                  |«      r| j                  j                  «        y y r   )rN   r!   Úmaintain_pool)r   rK   s     r   r+   zAutoscaler.maybe_scale^   s%   € Ø×Ñ˜SÔ!Ø�I‰I×#Ñ#Õ%ð "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‘   € Ø�Z‹ZØˆØ˜Ÿ™Ò'Ø—L‘L §¡°#Ñ!5Ô6Ø×4Ñ4°SÔ9Ø'*�Ô$ØˆØ˜Ÿ™Ò'Ø—J‘J˜s T§^¡^Ñ3Ô4Ø'*�Ô$Ø×'Ñ'¨×)=Ñ)=Ð=÷ �ZŠZús   �BB,Â,B5c                 óB   — t        «       | _        | j                  |«      S r   )r   r?   rT   ©r   Úns     r   rH   zAutoscaler.scale_upo   s   € Ü'›kˆÔØ�z‰z˜!‹}Ð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Ñ1°D·N±NÒ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Ø�I‰I×Ñ˜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   € Ø˜×-Ñ-Ñ-ˆÙØ�K‰K× Ñ ×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,   € à×'Ñ'Ø×'Ñ'Ø—~‘~Ø—8‘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‰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   =   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§;¡;°·±Ð €€tˆUá˜BŸJ™JŸN™NÐ+@À"ÓEÓFÐ ô3�i×-Ñ-ô 3ô<]'�õ ]'r   