o
    Df                     @   s   d Z ddl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d
ZdZdd ejD D ]ZdD ]ZeeedrKddlZeeee  q6q2		dddZG dd dejZG dd dejZdS )zEventlet execution pool.    N)	monotonicGreenletExit)timer)signals   )base)TaskPoolz6Celery module with %s imported before eventlet patched)z	billiard.zcelery.zkombu.c                 c   s    | ]
}| tr|V  qd S N)
startswith	RACE_MODS).0mod r   T/home/ubuntu/webapp/venv/lib/python3.10/site-packages/celery/concurrency/eventlet.py	<genexpr>   s    r   )thread	threadingsocketr   c                 C   s$   |si n|}t j| ||||| dS )N)pid)r   apply_target)targetargskwargscallbackaccept_callbackgetpidr   r   r   r      s   r   c                       sL   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Ze	dd Z
  ZS )TimerzEventlet Timer.c                    sB   ddl m} ddlm} t j|i | || _|| _t | _d S )Nr   )spawn_afterr   )	eventlet.greenthreadr   greenletr   super__init___spawn_afterset_queue)selfr   r   r   r   	__class__r   r   r"   '   s   zTimer.__init__c                 K   sR   t |t  d}| ||}| j| || j| ||_||_||_	d|_
|S )Nr   F)maxr   r#   r%   addlink_entry_exitentryetaprioritycanceled)r&   r.   r/   r-   r   secsgr   r   r   _enter0   s   zTimer._enterc              	   C   sd   z*z|   W n | jy   |  d|_Y n
w W | j| d S W | j| d S | j| w )NT)waitr   cancelr0   r%   discard)r&   r2   r-   r   r   r   r,   ;   s   
zTimer._entry_exitc              	   C   s@   | j }|rz|   W n t| jfy   Y nw |sd S d S r
   )r%   popr5   KeyErrorr   )r&   queuer   r   r   clearE   s   zTimer.clearc                 C   s&   z|   W d S  | jy   Y d S w r
   )r5   r   )r&   trefr   r   r   r5   M   s
   zTimer.cancelc                 C   s   | j S r
   )r%   r&   r   r   r   r9   S   s   zTimer.queue)__name__
__module____qualname____doc__r"   r3   r,   r:   r5   propertyr9   __classcell__r   r   r'   r   r   $   s    	
r   c                       s   e Zd ZdZeZdZdZdZdZdZ	dZ
 fddZdd Zd	d
 Z		dddZdddZdddZdddZ fddZedd Zdd Zedd Z  ZS )r	   zEventlet Task Pool.FTNc                    sR   ddl m  ddlm} || _ j| _ fdd| _ j| _t j	|i | d S )Nr   greenthread)	GreenPoolc                      s   t   S r
   )id
getcurrentr   rC   r   r   <lambda>i   s    z#TaskPool.__init__.<locals>.<lambda>)
eventletrD   eventlet.greenpoolrE   PoolrG   r   spawn_nr!   r"   )r&   r   r   rE   r'   rC   r   r"   d   s   zTaskPool.__init__c                 C   s:   |  | j| _i | _tjj| d | jj| _tj	j| _
d S N)sender)rK   limit_pool	_pool_mapr   eventlet_pool_startedsendspawn
_quick_puteventlet_pool_apply_quick_apply_sigr<   r   r   r   on_startn   s
   
zTaskPool.on_startc                 C   s4   t jj| d | jd ur| j  t jj| d d S rM   )r   eventlet_pool_preshutdownrS   rP   waitalleventlet_pool_postshutdownr<   r   r   r   on_stopu   s   

zTaskPool.on_stopc              	   K   sH   t |}| j| |||d | t|||||| j}| t|| d S )N)rN   r   r   r   )r	   _make_killable_targetrW   rU   r   r   _add_to_pool_maprF   )r&   r   r   r   r   r   _r    r   r   r   on_apply{   s   
zTaskPool.on_applyr   c                 C   s    | j | }| j| || _ d S r
   rO   rP   resizer&   nrO   r   r   r   grow      

zTaskPool.growc                 C   s    | j | }| j| || _ d S r
   ra   rc   r   r   r   shrink   rf   zTaskPool.shrinkc                 C   s0   || j  v r| j | }|  |  d S d S r
   )rQ   keyskillr4   )r&   r   signalr    r   r   r   terminate_job   s
   
zTaskPool.terminate_jobc                    s.   t   }|| j| j | j d |S )N)zmax-concurrencyzfree-threadszrunning-threads)r!   	_get_infoupdaterO   rP   freerunning)r&   infor'   r   r   rl      s   
zTaskPool._get_infoc                    s    fdd}|S )Nc                     s&   z | i |W S  t y   Y dS w )N)FNNr   )r   r   r   r   r   killable_target   s
   z7TaskPool._make_killable_target.<locals>.killable_targetr   )r   rr   r   rq   r   r]      s   zTaskPool._make_killable_targetc                 C   s    || j |< |tj| j | d S r
   )rQ   r+   r	   _cleanup_after_job_finish)r&   r   r    r   r   r   r^      s   
zTaskPool._add_to_pool_mapc                 C   s
   ||= d S r
   r   )r    pool_mapr   r   r   r   rs      s   
z"TaskPool._cleanup_after_job_finish)NNNN)r   r
   )r=   r>   r?   r@   r   signal_safeis_greentask_join_will_blockrP   rQ   rU   r"   rX   r\   r`   re   rg   rk   rl   staticmethodr]   r^   rs   rB   r   r   r'   r   r	   X   s0    




	
r	   )r   NNNN)r@   systimer   r    r   kombu.asynchronousr   _timerceleryr    r   __all__W_RACEr   modulesr   sidegetattrwarningswarnRuntimeWarningr   r   BasePoolr	   r   r   r   r   <module>   s,    
4