o
    ›¨Êh  ã                   @   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   úM/var/www/html/env/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