o
    hY                  	   @   s   d Z ddlZddl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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d ZdS )zGevent execution pool.    N)	monotonic)timer   )base)Timeout)TaskPool c                 K   s,   |si n|}t j| ||||fd| i|S )Npid)r   apply_target)targetargskwargscallbackaccept_callbackgetpid_r   r   [/var/www/html/optinet_system/venv/lib/python3.10/site-packages/celery/concurrency/gevent.pyr
      s   r
   c
                 K   s|   |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   )r   r   r   r   r   r   timeouttimeout_callbackr   r
   restr   r   r   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(   r1   r2   r0   r   secsgr   r   r   _enter7   s   zTimer._enterc              	   C   s*   z|   W | j| d S | j| w N)r   r'   discard)r(   r5   r   r   r   r/   B   s   
zTimer._entry_exitc                 C   s:   | j }|rz|   W n	 ty   Y nw |sd S d S r7   )r'   popr   KeyError)r(   queuer   r   r   clearH   s   zTimer.clearc                 C   s   | j S r7   )r'   r(   r   r   r   r;   P   s   zTimer.queue)
r   r   r   r%   r6   r/   r<   propertyr;   __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dddefddZdddZdddZdddZedd Zedd Zdd Zedd Z  ZS )r   zGEvent Pool.FTNc                    s^   ddl m m} ddlm} || _ | _ fdd| _|| _|d| _t	 j
|i | d S )Nr   )
getcurrent	spawn_raw)Poolc                      s
   t   S r7   )idr   r@   r   r   <lambda>f   s   
 z#TaskPool.__init__.<locals>.<lambda>r   )r"   r@   rA   gevent.poolrB   r   spawn_ngetr   r$   r%   )r(   r   r   rA   rB   r)   rD   r   r%   a   s   zTaskPool.__init__c                 C   s"   |  | j| _i | _| jj| _d S r7   )rB   limit_pool	_pool_mapspawn
_quick_putr=   r   r   r   on_startk   s   zTaskPool.on_startc                 C   s   | j d ur| j   d S d S r7   )rJ   joinr=   r   r   r   on_stopp   s   
zTaskPool.on_stopc	                 K   sd   |d u r| j n|}| |}| j|rtn||||||| j||d	}
| t|
|
 tt	|
|
_
|
S )N)r   r   )r   _make_killable_targetrM   r   r   _add_to_pool_maprC   types
MethodType
_terminate	terminate)r(   r   r   r   r   r   r   r   r
   r   greenletr   r   r   on_applyt   s   

zTaskPool.on_applyr   c                 C   s&   | j j j|7  _| j  j|7  _d S r7   rJ   
_semaphorecountersizer(   nr   r   r   grow      zTaskPool.growc                 C   s&   | j j j|8  _| j  j|8  _d S r7   rY   r]   r   r   r   shrink   r`   zTaskPool.shrinkc                 C   s.   dd l }|| jv r| j| }|| d S d S )Nr   )r"   rK   r   )r(   r	   signalr"   rW   r   r   r   terminate_job   s
   

zTaskPool.terminate_jobc                 C   s
   t | jS r7   )lenrJ   r=   r   r   r   num_processes      
zTaskPool.num_processesc                    s    fdd}|S )Nc                     s2   ddl m} z | i |W S  |y   Y dS w )Nr   )r   )FNN)rW   r   )r   r   r   r   r   r   killable_target   s   z7TaskPool._make_killable_target.<locals>.killable_targetr   )r   rh   r   rg   r   rQ      s   zTaskPool._make_killable_targetc                 C   s(   || j |< |tj| j|| j d d S )N)r	   pool_map)rK   r.   	functoolspartial_cleanup_after_job_finish)r(   r	   rW   r   r   r   rR      s   
zTaskPool._add_to_pool_mapc                 C   s
   ||= d S r7   r   )rW   ri   r	   r   r   r   rl      rf   z"TaskPool._cleanup_after_job_finish)r   r7   )r   r   r   __doc__r   signal_safeis_greentask_join_will_blockrJ   rK   rM   r%   rN   rP   r
   rX   r_   ra   rc   r>   re   staticmethodrQ   rR   rl   r?   r   r   r)   r   r   U   s4    







r   c                 C   s   d S r7   r   )r(   rb   r   r   r   rU      s   rU   )r   NNNN)rm   rj   rS   timer   kombu.asynchronousr   _timer r   r"   r   ImportError__all__r
   r   r   BasePoolr   rU   r   r   r   r   <module>   s.    

+T