U
    d                     @   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 ]4ZdD ]*ZeeedrlddlZeeee  qlqdd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   ?/tmp/pip-unpacked-wheel-mu1yl971/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                    s>   ddl m} ddlm} t j|| || _|| _t | _d S )Nr   )spawn_afterr   )	Z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   Zsecsgr   r   r   _enter0   s    zTimer._enterc              	   C   sJ   z6z|  W n$ | jk
r2   |  d|_Y nX W 5 | j | X d S )NT)r$   discardwaitr   cancelr/   )r%   r0   r,   r   r   r   r+   ;   s    zTimer._entry_exitc              	   C   s<   | j }|r8z|   W q t| jfk
r4   Y qX qd S r
   )r$   popr4   KeyErrorr   )r%   queuer   r   r   clearE   s    zTimer.clearc                 C   s(   z|   W n | jk
r"   Y nX d S r
   )r4   r   )r%   Ztrefr   r   r   r4   M   s    zTimer.cancelc                 C   s   | j S r
   )r$   r%   r   r   r   r7   S   s    zTimer.queue)__name__
__module____qualname____doc__r!   r1   r+   r8   r4   propertyr7   __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                    sN   ddl m  ddlm} || _ j| _ fdd| _ j| _t j	|| d S )Nr   greenthread)	GreenPoolc                      s   t   S r
   )id
getcurrentr   r@   r   r   <lambda>i       z#TaskPool.__init__.<locals>.<lambda>)
ZeventletrA   Zeventlet.greenpoolrB   PoolrD   r   Zspawn_nr    r!   )r%   r   r   rB   r&   r@   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)rG   limit_pool	_pool_mapr   Zeventlet_pool_startedsendspawn
_quick_putZeventlet_pool_apply_quick_apply_sigr9   r   r   r   on_startn   s
    
zTaskPool.on_startc                 C   s4   t jj| d | jd k	r"| j  t jj| d d S rH   )r   Zeventlet_pool_preshutdownrM   rK   ZwaitallZeventlet_pool_postshutdownr9   r   r   r   on_stopu   s    

zTaskPool.on_stopc              	   K   sH   t |}| j| |||d | t|||||| j}| t|| d S )N)rI   r   r   r   )r	   _make_killable_targetrP   rO   r   r   _add_to_pool_maprC   )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
   rJ   rK   resizer%   nrJ   r   r   r   grow   s    
zTaskPool.growc                 C   s    | j | }| j| || _ d S r
   rW   rY   r   r   r   shrink   s    
zTaskPool.shrinkc                 C   s,   || j  kr(| j | }|  |  d S r
   )rL   keyskillr3   )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updaterJ   rK   freeZrunning)r%   infor&   r   r   ra      s    
zTaskPool._get_infoc                    s    fdd}|S )Nc                     s(   z | |W S  t k
r"   Y dS X d S )N)FNNr   )r   r   r   r   r   killable_target   s    z7TaskPool._make_killable_target.<locals>.killable_targetr   )r   rf   r   re   r   rS      s    zTaskPool._make_killable_targetc                 C   s    || j |< |tj| j | d S r
   )rL   r*   r	   _cleanup_after_job_finish)r%   r   r   r   r   r   rT      s    
zTaskPool._add_to_pool_mapc                 C   s
   ||= d S r
   r   )r   Zpool_mapr   r   r   r   rg      s    z"TaskPool._cleanup_after_job_finish)NNNN)r   )r   )N)r:   r;   r<   r=   r   Zsignal_safeZis_greenZtask_join_will_blockrK   rL   rO   r!   rQ   rR   rV   r[   r\   r`   ra   staticmethodrS   rT   rg   r?   r   r   r&   r   r	   X   s.   
  



	
r	   )r   NNNN)r=   systimer   r   r   Zkombu.asynchronousr   Z_timerZceleryr    r   __all__ZW_RACEr   modulesr   ZsidegetattrwarningswarnRuntimeWarningr   r   ZBasePoolr	   r   r   r   r   <module>   s(       
4