o
    wvXj  ã                   @   s¢   d Z ddlmZmZm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mZ dd	l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.
é    )Úabsolute_importÚprint_functionÚunicode_literalsN)Úcount)Úsleep)ÚEntry)ÚTimer)ÚloggerÚto_timestamp)ÚTHREAD_TIMEOUT_MAXÚ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,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                    s2   dd l }tdƒ | ¡  tt| ƒj|i |¤Ž d S )Nr   z- Timer starting)Ú	tracebackÚprintÚprint_stackÚsuperr   Ústart)ÚselfÚargsÚkwargsr   ©Ú	__class__© úP/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/utils/timer2.pyr   +   s   zTimer.startc                 K   sz   |p| j ||d�| _|| _|p| j| _tj | ¡ t ¡ | _t ¡ | _	t 
¡ | _t | j¡| _d| _d t| jƒ¡| _d S )N)Úon_errorÚmax_intervalTz	Timer-{0})r   ÚscheduleÚon_startÚon_tickÚ	threadingÚThreadÚ__init__ÚEventÚ_is_shutdownÚ_is_stoppedÚLockÚmutexÚ	ConditionÚ	not_emptyÚdaemonÚformatÚnextÚ_timer_countÚname)r   r   r   r   r   r   r   r   r   r   r"   1   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$   ÚisSetr4   r   r   r%   ÚsetÚ	TypeErrorÚ	Exceptionr	   ÚerrorÚsysÚstderrÚflushÚosÚ_exit)r   r2   Úexcr   r   r   ÚrunI   s.   


ùý
€ýz	Timer.runc                 C   s2   | j  ¡  | jr| j ¡  |  t¡ d| _d S d S )NF)r$   r9   r6   r%   r0   Újoinr   ©r   r   r   r   Ústopa   s   



ýz
Timer.stopc                 C   s2   | j s|  ¡ s| jr|  | ¡ |  ¡  d S d S d S ©N)r6   Úis_aliver   r   rE   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 rG   )rI   r'   Úgetattrr   r)   Únotify)r   Úmethr   r   r3   r   r   r   Ú	_do_entern   s   
$ýzTimer._do_enterc                 C   s   | j d|||d�S )NÚenter_at)Úpriority©rM   )r   r3   ÚetarO   r   r   r   Úenteru   s   zTimer.enterc                 O   ó   | j dg|¢R i |¤ŽS )NÚcall_atrP   ©r   r   r   r   r   r   rT   x   ó   zTimer.call_atc                 O   rS   )NÚenter_afterrP   rU   r   r   r   rW   {   rV   zTimer.enter_afterc                 O   rS   )NÚ
call_afterrP   rU   r   r   r   rX   ~   rV   zTimer.call_afterc                 O   rS   )NÚcall_repeatedlyrP   rU   r   r   r   rY   �   rV   zTimer.call_repeatedlyé
   c                 C   s   |   |tj|¡ d S rG   )rX   r=   Úexit)r   ÚsecsrO   r   r   r   Ú
exit_after„   s   zTimer.exit_afterc                 C   s   |  ¡  d S rG   )Úcancel)r   Útrefr   r   r   r^   ‡   s   zTimer.cancelc                 C   s   | j  ¡  d S rG   )r   ÚclearrE   r   r   r   r`   Š   s   zTimer.clearc                 C   s
   t | ƒ S rG   )ÚlenrE   r   r   r   Úempty�   ó   
zTimer.emptyc                 C   s
   t | jƒS rG   )ra   r   rE   r   r   r   Ú__len__�   rc   zTimer.__len__c                 C   s   dS )z``bool(timer)``.Tr   rE   r   r   r   Ú__bool__“   s   zTimer.__bool__c                 C   s   | j jS rG   )r   ÚqueuerE   r   r   r   rf   ˜   s   zTimer.queue)NNNNNrG   )rZ   )#Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r6   r   r   r-   r   r   r"   r4   Ú__next__r,   rC   rF   rI   rM   rR   rT   rW   rX   rY   r]   r^   r`   rb   rd   re   Ú__nonzero__Úpropertyrf   Ú__classcell__r   r   r   r   r      s@    
ÿ

r   )rj   Ú
__future__r   r   r   r@   r=   r    Ú	itertoolsr   Útimer   Úkombu.asynchronous.timerr   r   r   r	   r
   Úcelery.fiver   ÚenvironÚgetr   Ú__all__r!   r   r   r   r   Ú<module>   s   