o
    Df;                  	   @   s   d Z ddlmZ ddlmZ ddlmZ zddlm	Z	 W n e
y'   dZ	Y nw dZd	dddddde	ejf	d
dZG dd dejZG dd dejZdS )zGevent execution pool.    )	monotonic)timer   )base)TimeoutN)TaskPool c
                 K   sz   |si n|}z(|| |	| |||||fd|fi|
W  d    W S 1 s'w   Y  W d S  |y<   |d| Y S w )N	propagateFr   )targetargskwargscallbackaccept_callbackpidtimeouttimeout_callbackr   apply_targetrestr   r   R/home/ubuntu/webapp/venv/lib/python3.10/site-packages/celery/concurrency/gevent.pyapply_timeout   s   

(r   c                       s@   e Zd Z fddZdd Zdd Zdd Zed	d
 Z  Z	S )Timerc                    sN   ddl m m} G  fddd }|| _|| _t j|i | t | _d S )Nr   )GreenletGreenletExitc                       s   e Zd Z jZdS )z!Timer.__init__.<locals>._GreenletN)__name__
__module____qualname__killcancelr   r   r   r   	_Greenlet&   s    
r   )	geventr   r   r   _GreenletExitsuper__init__set_queue)selfr   r   r   r   	__class__r   r   r#   #   s   zTimer.__init__c                 K   sR   t |t  d}| j||}| j| || j ||_||_	||_
d|_|S )Nr   F)maxr   r   spawn_laterr%   addlink_entry_exitentryetaprioritycanceled)r&   r/   r0   r.   r   secsgr   r   r   _enter.   s   zTimer._enterc              	   C   s*   z|   W | j| d S | j| w N)r   r%   discard)r&   r3   r   r   r   r-   9   s   
zTimer._entry_exitc                 C   s:   | j }|rz|   W n	 ty   Y nw |sd S d S r5   )r%   popr   KeyError)r&   queuer   r   r   clear?   s   zTimer.clearc                 C   s   | j S r5   )r%   r&   r   r   r   r9   G   s   zTimer.queue)
r   r   r   r#   r4   r-   r:   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	 fddZ
dd Zd	d
 ZddddddejfddZdddZdddZedd Z  ZS )r   zGEvent Pool.FTNc                    sF   ddl m} ddlm} || _|| _|d| _t j|i | d S )Nr   )	spawn_raw)Poolr   )	r    r>   gevent.poolr?   spawn_ngetr   r"   r#   )r&   r   r   r>   r?   r'   r   r   r#   W   s   zTaskPool.__init__c                 C   s   |  | j| _| jj| _d S r5   )r?   limit_poolspawn
_quick_putr;   r   r   r   on_start_   s   zTaskPool.on_startc                 C   s   | j d ur| j   d S d S r5   )rD   joinr;   r   r   r   on_stopc   s   
zTaskPool.on_stopc	           
   
   K   s4   |d u r| j n|}| j|rtn||||||||dS )N)r   r   )r   rF   r   )
r&   r
   r   r   r   r   r   r   r   _r   r   r   on_applyg   s   
zTaskPool.on_applyr   c                 C   s&   | j j j|7  _| j  j|7  _d S r5   rD   
_semaphorecountersizer&   nr   r   r   growp      zTaskPool.growc                 C   s&   | j j j|8  _| j  j|8  _d S r5   rL   rP   r   r   r   shrinkt   rS   zTaskPool.shrinkc                 C   s
   t | jS r5   )lenrD   r;   r   r   r   num_processesx   s   
zTaskPool.num_processes)r   )r   r   r   __doc__r   signal_safeis_greentask_join_will_blockrD   rF   r#   rG   rI   r   r   rK   rR   rT   r<   rV   r=   r   r   r'   r   r   L   s&    

	
r   )rW   timer   kombu.asynchronousr   _timer r   r    r   ImportError__all__r   r   r   BasePoolr   r   r   r   r   <module>   s"    
+