o
    ›¨ÊhÍ  ã                   @   sŽ   d Z ddlZddl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dl
mZmZ ej d	¡Zd
ZG dd„ dejƒZdS )z­Scheduler for Python functions.

.. note::
    This is used for the thread-based worker only,
    not for amqp/redis/sqs/qpid where :mod:`kombu.asynchronous.timer` is used.
é    N)Úcount)ÚTIMEOUT_MAX)Úsleep)ÚEntry)ÚTimer)ÚloggerÚto_timestampÚTIMER_DEBUG)r   ÚScheduler   r   c                       sê   e Zd ZdZeZeZdZdZedƒZ	e
r‡ fdd„Z		d,‡ fdd„	Zd	d
„ Ze ZZdd„ Zdd„ Zdd„ Zdd„ Zd-dd„Zdd„ Zdd„ Zdd„ Zdd„ Zd.dd„Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ ZeZe d*d+„ ƒZ!‡  Z"S )/r   z^Timer thread.

    Note:
        This is only used for transports not supporting AsyncIO.
    FNé   c                    s.   dd l }tdƒ | ¡  tƒ j|i |¤Ž d S )Nr   z- Timer starting)Ú	tracebackÚprintÚprint_stackÚsuperÚstart)ÚselfÚargsÚkwargsr   ©Ú	__class__© úE/var/www/html/env/lib/python3.10/site-packages/celery/utils/timer2.pyr   '   s   zTimer.startc                    sx   |p| j ||d�| _|| _|p| j| _tƒ  ¡  t ¡ | _t ¡ | _	t 
¡ | _t | j¡| _d| _dt| jƒ› �| _d S )N)Úon_errorÚmax_intervalTzTimer-)r
   ÚscheduleÚon_startÚon_tickr   Ú__init__Ú	threadingÚEventÚ_Timer__is_shutdownÚ_Timer__is_stoppedÚLockÚmutexÚ	ConditionÚ	not_emptyÚdaemonÚnextÚ_timer_countÚname)r   r   r   r   r   r   r   r   r   r   r   -   s   
ÿ



zTimer.__init__c                 C   sn   | j �& t| jƒ\}}|d u r"|d u r| j  d¡ |W  d   ƒ S W d   ƒ n1 s,w   Y  | j |¡S )Ng      ð?)r%   r'   Ú	schedulerÚwaitr   Úapply_entry)r   ÚdelayÚentryr   r   r   Ú_next_entry?   s   ûþzTimer._next_entryc              
   C   sÊ   z?d| _ t| jƒ| _| j ¡ s+|  ¡ }|r&| jr|  |¡ td u r"n	t|ƒ | j ¡ rz	| j	 
¡  W W d S  ty?   Y W d S w  tyd } ztjd|dd� tj ¡  t d¡ W Y d }~d S d }~ww )NTzThread Timer crashed: %r)Úexc_infor   )ÚrunningÚiterr   r*   r    Úis_setr/   r   r   r!   ÚsetÚ	TypeErrorÚ	Exceptionr   ÚerrorÚsysÚstderrÚflushÚosÚ_exit)r   r-   Úexcr   r   r   ÚrunI   s.   


ùý
€ýz	Timer.runc                 C   s2   | j  ¡  | jr| j ¡  |  t¡ d| _d S d S )NF)r    r4   r1   r!   r+   ÚjoinÚTHREAD_TIMEOUT_MAX©r   r   r   r   Ústopa   s   



ýz
Timer.stopc                 C   s2   | j s|  ¡ s| jr|  | ¡ |  ¡  d S d S d S ©N)r1   Úis_aliver   r   rA   r   r   r   Úensure_startedh   s
   
ýzTimer.ensure_startedc                 O   sV   |   ¡  | j� t| j|ƒ|i |¤Ž}| j ¡  |W  d   ƒ S 1 s$w   Y  d S rC   )rE   r#   Úgetattrr   r%   Únotify)r   Úmethr   r   r.   r   r   r   Ú	_do_entern   s   
$ýzTimer._do_enterc                 C   s   | j d|||d�S )NÚenter_at)Úpriority©rI   )r   r.   ÚetarK   r   r   r   Úenteru   s   zTimer.enterc                 O   ó   | j dg|¢R i |¤ŽS )NÚcall_atrL   ©r   r   r   r   r   r   rP   x   ó   zTimer.call_atc                 O   rO   )NÚenter_afterrL   rQ   r   r   r   rS   {   rR   zTimer.enter_afterc                 O   rO   )NÚ
call_afterrL   rQ   r   r   r   rT   ~   rR   zTimer.call_afterc                 O   rO   )NÚcall_repeatedlyrL   rQ   r   r   r   rU   �   rR   zTimer.call_repeatedlyé
   c                 C   s   |   |tj|¡ d S rC   )rT   r8   Úexit)r   ÚsecsrK   r   r   r   Ú
exit_after„   s   zTimer.exit_afterc                 C   s   |  ¡  d S rC   )Úcancel)r   Útrefr   r   r   rZ   ‡   s   zTimer.cancelc                 C   s   | j  ¡  d S rC   )r   ÚclearrA   r   r   r   r\   Š   s   zTimer.clearc                 C   s
   t | ƒ S rC   )ÚlenrA   r   r   r   Úempty�   ó   
zTimer.emptyc                 C   s
   t | jƒS rC   )r]   r   rA   r   r   r   Ú__len__�   r_   zTimer.__len__c                 C   s   dS )z``bool(timer)``.Tr   rA   r   r   r   Ú__bool__“   s   zTimer.__bool__c                 C   s   | j jS rC   )r   ÚqueuerA   r   r   r   rb   ˜   s   zTimer.queue)NNNNNrC   )rV   )#Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r
   r1   r   r   r(   r	   r   r   r/   Ú__next__r'   r>   rB   rE   rI   rN   rP   rS   rT   rU   rY   rZ   r\   r^   r`   ra   Ú__nonzero__Úpropertyrb   Ú__classcell__r   r   r   r   r      s@    ÿ

r   )rf   r;   r8   r   Ú	itertoolsr   r   r@   Útimer   Úkombu.asynchronous.timerr   r   r
   r   r   ÚenvironÚgetr	   Ú__all__ÚThreadr   r   r   r   Ú<module>   s    