o
    Df                     @   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 )zScheduler 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__ L/home/ubuntu/webapp/venv/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    