
    [jB                        d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	m
Z
 ddlmZ  G d d          Z e            ZddZddZddZdS )z-Run a target function on a background thread.    )annotationsN)AnyCallableOptional)_create_lockc                  f    e Zd Z	 ddd	ZddZd dZdd!dZdd"dZd dZd#dZ	d dZ
d$dZd dZdS )%PeriodicExecutorNintervalfloatmin_intervaltargetCallable[[], bool]nameOptional[str]c                    d| _         || _        || _        || _        d| _        d| _        || _        d| _        d| _        t                      | _
        dS )a   "Run a target function periodically on a background thread.

        If the target's return value is false, the executor stops.

        :Parameters:
          - `interval`: Seconds between calls to `target`.
          - `min_interval`: Minimum seconds between calls if `wake` is
            called very often.
          - `target`: A function.
          - `name`: A name to give the underlying thread.
        FN)_event	_interval_min_interval_target_stopped_thread_name_skip_sleep_thread_will_exitr   _lock)selfr
   r   r   r   s        ]/var/www/app.qaans.com/backend/venv/lib/python3.11/site-packages/pymongo/periodic_executor.py__init__zPeriodicExecutor.__init__   sU    , !)37
 !&!^^


    returnstrc                T    d| j         j         d| j         dt          |           ddS )N<z(name=z) object at 0xx>)	__class____name__r   idr   s    r   __repr__zPeriodicExecutor.__repr__>   s3    Y4>*YY$*YYBtHHYYYYYr   Nonec                   | j         5  | j        r4	 | j        J | j                                         n# t          $ r Y nw xY wd| _        d| _        ddd           n# 1 swxY w Y   d}	 | j        o| j                                        }n# t          $ r Y nw xY w|st          j        | j	        | j
                  }d|_        t          j        |          | _        t          |            	 |                                 dS # t           $ r7}dt#          |          v st%          j                    rd| _        Y d}~dS  d}~ww xY wdS )zgStart. Multiple calls have no effect.

        Not safe to call from multiple threads at once.
        NF)r   r   Tzinterpreter shutdown)r   r   r   joinReferenceErrorr   is_alive	threadingThread_runr   daemonweakrefproxy_register_executorstartRuntimeErrorr!   sysis_finalizing)r   startedthreades       r   openzPeriodicExecutor.openA   s   
 Z 	" 	"% 

<333L%%''''%   D &+D"!DM	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	l>t|'<'<'>'>GG 	 	 	D	  	%TYTZHHHF FM"=00DLt$$$   )SVV33s7H7J7J3#'DLFFFFF		 	s`   A"4A
AA AAA"%A", B 
BB/D 
E+E EEdummyr   c                    d| _         dS )zStop. To restart, call open().

        The dummy parameter allows an executor's close method to be a weakref
        callback; see monitor.py.
        TN)r   )r   r?   s     r   closezPeriodicExecutor.closej   s     r   timeoutOptional[int]c                ~    | j         5	 | j                             |           d S # t          t          f$ r Y d S w xY wd S N)r   r-   r.   r8   )r   rB   s     r   r-   zPeriodicExecutor.joinr   sZ    <#!!'*****"L1    $#s   % ::c                    d| _         dS )z!Execute the target function soon.TN)r   r)   s    r   wakezPeriodicExecutor.wakez   s    r   new_intervalintc                    || _         d S rE   )r   )r   rH   s     r   update_intervalz PeriodicExecutor.update_interval~   s    %r   c                    d| _         d S )NT)r   r)   s    r   
skip_sleepzPeriodicExecutor.skip_sleep   s    r   boolc                    | j         5  | j        rd| _        	 d d d            dS 	 d d d            dS # 1 swxY w Y   d S NTF)r   r   r   r)   s    r   __should_stopzPeriodicExecutor.__should_stop   s    Z 	 	} )-&	 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   3377c                ,   |                                  s	 |                                 s	d| _        d S n<# t          $ r/ | j        5  d| _        d| _        d d d            n# 1 swxY w Y    w xY w| j        rd| _        nxt          j                    | j	        z   }| j        sVt          j                    |k     r?t          j
        | j                   | j        rn| j        st          j                    |k     ?d| _        |                                  d S d S rP   )_PeriodicExecutor__should_stopr   r   BaseExceptionr   r   r   time	monotonicr   sleepr   r   )r   deadlines     r   r2   zPeriodicExecutor._run   s   $$&& 	 	||~~ $(DME !   Z 2 2$(DM-1D*2 2 2 2 2 2 2 2 2 2 2 2 2 2 2   #(  >++dn<- DN,<,<x,G,GJt1222{  - DN,<,<x,G,G
  DK+ $$&& 	  	  	  	  	 s-   4 A-A A- A$	$A-'A$	(A-rE   )r
   r   r   r   r   r   r   r   )r    r!   r    r+   )r?   r   r    r+   )rB   rC   r    r+   )rH   rI   r    r+   )r    rN   )r'   
__module____qualname__r   r*   r>   rA   r-   rG   rK   rM   rS   r2    r   r   r	   r	      s         #$ $ $ $ $BZ Z Z Z' ' ' 'R           & & & &                     r   r	   executorr    r+   c                n    t          j        | t                    }t                              |           d S rE   )r4   ref_on_executor_deleted
_EXECUTORSadd)r]   r_   s     r   r6   r6      s,    
+h 4
5
5CNN3r   r_   'weakref.ReferenceType[PeriodicExecutor]c                :    t                               |            d S rE   )ra   remove)r_   s    r   r`   r`      s    cr   c                     t           d S t          t                     } | D ]"} |            }|r|                                 #| D ]#} |            }|r|                    d           $d }d S )N   )ra   listrA   r-   )	executorsr_   r]   s      r   _shutdown_executorsrj      s     Z  I   355 	NN   355 	MM!HHHr   )r]   r	   r    r+   )r_   rc   r    r+   rY   )__doc__
__future__r   r9   r0   rU   r4   typingr   r   r   pymongo.lockr   r	   setra   r6   r`   rj   r\   r   r   <module>rp      s    4 3 " " " " " " 



       * * * * * * * * * * % % % % % %E  E  E  E  E  E  E  E \ SUU
   
        r   