U
    bhY                  	   @   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k
r`   dZY nX 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   =/tmp/pip-unpacked-wheel-kcem4wq5/celery/concurrency/gevent.pyr
      s    r
   c
              
   K   st   |si n|}zD||2 |	| ||||| fd|fi|
W  5 Q R  W S Q R X W n |k
rn   |d| Y S X d S )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                    sJ   ddl m m} G  fddd }|| _|| _t j|| 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!   Z_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!   Zspawn_laterr&   addlink_entry_exitentryetaprioritycanceled)r'   r/   r0   r.   r   Zsecsgr   r   r   _enter7   s    zTimer._enterc              	   C   s    z|  W 5 | j | X d S N)r&   discardr   )r'   r2   r   r   r   r-   B   s    zTimer._entry_exitc                 C   s6   | j }|r2z|   W q tk
r.   Y qX qd S r4   )r&   popr   KeyError)r'   queuer   r   r   clearH   s    zTimer.clearc                 C   s   | j S r4   )r&   r'   r   r   r   r8   P   s    zTimer.queue)
r   r   r   r$   r3   r-   r9   propertyr8   __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                    sZ   ddl m m} ddlm} || _ | _ fdd| _|| _|d| _t	 j
|| d S )Nr   )
getcurrent	spawn_raw)Poolc                      s
   t   S r4   )idr   r=   r   r   <lambda>f       z#TaskPool.__init__.<locals>.<lambda>r   )r"   r=   r>   Zgevent.poolr?   r   Zspawn_ngetr   r#   r$   )r'   r   r   r>   r?   r(   rA   r   r$   a   s    zTaskPool.__init__c                 C   s"   |  | j| _i | _| jj| _d S r4   )r?   limit_pool	_pool_mapspawn
_quick_putr:   r   r   r   on_startk   s    zTaskPool.on_startc                 C   s   | j d k	r| j   d S r4   )rF   joinr:   r   r   r   on_stopp   s    
zTaskPool.on_stopc	                 K   sd   |d kr| j n|}| |}| j|r(tn||||||| j||d	}
| t|
|
 tt	|
|
_
|
S )N)r   r   )r   _make_killable_targetrI   r   r   _add_to_pool_mapr@   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 r4   rF   Z
_semaphorecountersizer'   nr   r   r   grow   s    zTaskPool.growc                 C   s&   | j j j|8  _| j  j|8  _d S r4   rU   rX   r   r   r   shrink   s    zTaskPool.shrinkc                 C   s*   dd l }|| jkr&| j| }|| d S )Nr   )r"   rG   r   )r'   r	   signalr"   rS   r   r   r   terminate_job   s    

zTaskPool.terminate_jobc                 C   s
   t | jS r4   )lenrF   r:   r   r   r   num_processes   s    zTaskPool.num_processesc                    s    fdd}|S )Nc                     s4   ddl m} z | |W S  |k
r.   Y dS X d S )Nr   )r   )FNN)rS   r   )r   r   r   r   r   r   killable_target   s
    z7TaskPool._make_killable_target.<locals>.killable_targetr   )r   ra   r   r`   r   rM      s    zTaskPool._make_killable_targetc                 C   s(   || j |< |tj| j|| j d d S )N)r	   pool_map)rG   r,   	functoolspartial_cleanup_after_job_finish)r'   r	   rS   r   r   r   rN      s    
zTaskPool._add_to_pool_mapc                 C   s
   ||= d S r4   r   )rS   rb   r	   r   r   r   re      s    z"TaskPool._cleanup_after_job_finish)r   )r   )N)r   r   r   __doc__r   Zsignal_safeZis_greenZtask_join_will_blockrF   rG   rI   r$   rJ   rL   r
   rT   rZ   r[   r]   r;   r_   staticmethodrM   rN   re   r<   r   r   r(   r   r   U   s6   
  






r   c                 C   s   d S r4   r   )r'   r\   r   r   r   rQ      s    rQ   )r   NNNN)rf   rc   rO   timer   Zkombu.asynchronousr   Z_timer r   r"   r   ImportError__all__r
   r   r   ZBasePoolr   rQ   r   r   r   r   <module>   s2   
    
   
+T