o
    wvXj»  ã                   @   sÔ   d Z ddlmZm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	Zd
ZdZdd„ ejD ƒD ]ZdD ]ZeeedƒrMddlZe eee ƒ¡ q8q4		ddd„ZG dd„ dejƒZG dd„ dejƒZdS )zEventlet execution pool.é    )Úabsolute_importÚunicode_literalsN)Útimer)Ú	monotonic)Ú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   úX/var/www/html/myproject/venv/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                    sF   ddl m} ddlm} tt| ƒj|i |¤Ž || _|| _tƒ | _	d S )Nr   )Úspawn_after)ÚGreenletExit)
Úeventlet.greenthreadr   Úgreenletr   Úsuperr   Ú__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/   r0   r.   r   ÚsecsÚgr   r   r   Ú_enter2   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   Úcancelr1   r&   Údiscard)r'   r3   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&   Úpopr6   ÚKeyErrorr   )r'   Úqueuer   r   r   ÚclearG   s   ÿýzTimer.clearc                 C   s&   z|  ¡  W d S  | jy   Y d S w r
   )r6   r   )r'   Útrefr   r   r   r6   O   s
   ÿzTimer.cancelc                 C   s   | j S r
   )r&   ©r'   r   r   r   r:   U   s   zTimer.queue)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r4   r-   r;   r6   Úpropertyr:   Ú__classcell__r   r   r(   r   r   &   s    	
r   c                       sv   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„Zddd„Zddd„Z‡ fdd„Z‡  ZS )r	   zEventlet Task Pool.FTNc                    sV   ddl m‰  ddlm} || _ˆ j| _‡ fdd„| _ˆ j| _tt	| ƒj
|i |¤Ž d S )Nr   ©Úgreenthread)Ú	GreenPoolc                      s   t ˆ  ¡ ƒS r
   )ÚidÚ
getcurrentr   rD   r   r   Ú<lambda>j   s    z#TaskPool.__init__.<locals>.<lambda>)ÚeventletrE   Úeventlet.greenpoolrF   ÚPoolrH   r   Úspawn_nr"   r	   r#   )r'   r   r   rF   r(   rD   r   r#   e   s   zTaskPool.__init__c                 C   s4   |   | j¡| _tjj| d� | jj| _tjj| _	d S ©N)Úsender)
rL   ÚlimitÚ_poolr   Úeventlet_pool_startedÚsendrM   Ú
_quick_putÚeventlet_pool_applyÚ_quick_apply_sigr=   r   r   r   Úon_starto   s   
zTaskPool.on_startc                 C   s4   t jj| d� | jd ur| j ¡  t jj| d� d S rN   )r   Úeventlet_pool_preshutdownrS   rQ   ÚwaitallÚeventlet_pool_postshutdownr=   r   r   r   Úon_stopu   s   

zTaskPool.on_stopc              	   K   s.   | j | |||d� |  t|||||| j¡ d S )N)rO   r   r   r   )rV   rT   r   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
   ©rP   rQ   Úresize©r'   ÚnrP   r   r   r   Úgrow„   ó   

zTaskPool.growc                 C   s    | j | }| j |¡ || _ d S r
   r^   r`   r   r   r   Úshrink‰   rc   zTaskPool.shrinkc                    s2   t t| ƒ ¡ }| | j| j ¡ | j ¡ dœ¡ |S )N)zmax-concurrencyzfree-threadszrunning-threads)r"   r	   Ú	_get_infoÚupdaterP   rQ   ÚfreeÚrunning)r'   Úinfor(   r   r   re   Ž   s   ýzTaskPool._get_info)NNNN)r   )r>   r?   r@   rA   r   Úsignal_safeÚis_greenÚtask_join_will_blockrQ   rT   r#   rW   r[   r]   rb   rd   re   rC   r   r   r(   r   r	   Z   s"    

ÿ
	
r	   )r   NNNN)rA   Ú
__future__r   r   ÚsysÚkombu.asynchronousr   Ú_timerÚ
kombu.fiver   Úceleryr   Ú r   Ú__all__ÚW_RACEr   Úmodulesr   ÚsideÚgetattrÚwarningsÚwarnÚRuntimeWarningr   r   ÚBasePoolr	   r   r   r   r   Ú<module>   s,   €ý
ÿ4