
    l8'hZ                        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Zddlm	Z	m
Z
 ddlmZmZ dZ G d d      Z e       Zdd	Zdd
ZddZy)z-Run a target function on a background thread.    )annotationsN)AnyOptional)_ALock_create_lockFc                  z    e Zd Z	 d	 	 	 	 	 	 	 ddZ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y)PeriodicExecutorNc                    d| _         || _        || _        || _        d| _        d| _        || _        d| _        d| _        t        t                     | _        y)a  Run a target function periodically on a background thread.

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

        :param interval: Seconds between calls to `target`.
        :param min_interval: Minimum seconds between calls if `wake` is
            called very often.
        :param target: A function.
        :param name: A name to give the underlying thread.
        FN)_event	_interval_min_interval_target_stopped_thread_name_skip_sleep_thread_will_exitr   r   _lock)selfintervalmin_intervaltargetnames        b/var/www/html/trade_iq/venv/lib/python3.12/site-packages/pymongo/asynchronous/periodic_executor.py__init__zPeriodicExecutor.__init__    sT    * !)37
 !&LN+
    c                j    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__@   s4    4>>**+6$**^BtHUV<WXYYr   c                $   t         j                  dk(  rEt        j                         }	 |j	                  | j                                |j                          y t        j                  | j                                y # |j                          w xY w)Nwin32)sysplatformasyncioSelectorEventLooprun_until_complete_runcloserun)r   loops     r   
_run_asynczPeriodicExecutor._run_asyncC   s_     <<7",,.D''		4

KK		$ 

s   A= =Bc                   | j                   5  | j                  r)	 | j                  J | j                  j                          d| _        d| _        ddd       d}	 | j                  xr | j                  j                         }|st        r,t        j                  | j                  | j                        }n+t        j                  | j                  | j                        }d|_        t        j                  |      | _        t!        |        	 |j#                          yy# t        $ r Y w xY w# 1 sw Y   xY w# t        $ r Y w xY w# t$        $ r3}dt'        |      v st)        j*                         rd| _        Y d}~y d}~ww xY w)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_IS_SYNC	threadingThreadr-   r   r1   daemonweakrefproxy_register_executorstartRuntimeErrorstrr(   is_finalizing)r   startedthreades       r   openzPeriodicExecutor.openP   sP   
 ZZ 	"%%
<<333LL%%' &+D"!DM	" 	ll>t||'<'<'>G
 "))L"))tzzR FM"==0DLt$  & 	" 	""  		    )SV3s7H7H7J#'DL	s^   D1(D"D1(D= E "	D.+D1-D..D11D:=	E	E		F(FFFc                    d| _         y)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   dummys     r   r.   zPeriodicExecutor.close|   s     r   c                    | j                   	 | j                   j                  |       y y # t        t        f$ r Y y w xY wN)r   r3   r4   r>   )r   timeouts     r   r3   zPeriodicExecutor.join   sA    <<#!!'* $ #L1 s   + ==c                    d| _         y)z!Execute the target function soon.TN)r   r$   s    r   wakezPeriodicExecutor.wake   s	    r   c                    || _         y rH   )r   )r   new_intervals     r   update_intervalz PeriodicExecutor.update_interval   s	    %r   c                    d| _         y )NT)r   r$   s    r   
skip_sleepzPeriodicExecutor.skip_sleep   s
    r   c                   K   | j                   4 d {    | j                  rd| _        	 d d d       d {    y	 d d d       d {    y7 ;7 7 	# 1 d {  7  sw Y   y xY wwNTF)r   r   r   r$   s    r   _should_stopzPeriodicExecutor._should_stop   sh     :: 	 	}})-&	 	 	 		 	 	 	 	 	 	 	s]   A*AA*AA*AA*AA*	A
A*A*A*A'AA'#A*c                  K   | j                          d {   s	 | j                          d {   sd| _        y 	 | j                  rd| _        nt        j                         | j                  z   }| j                  sot        j                         |k  rXt        j                  | j                         d {    | j                  rn$| j                  st        j                         |k  rXd| _        | j                          d {   sy y 7 7 # t        $ rL | j                  4 d {  7   d| _        d| _        d d d       d {  7    # 1 d {  7  sw Y    xY ww xY w7 7 ewrR   )rS   r   r   BaseExceptionr   r   r   time	monotonicr   r*   sleepr   r   )r   deadlines     r   r-   zPeriodicExecutor._run   s7    ))+++	!\\^++$(DM , #( >>+dnn<--DNN,<x,G!--(:(:;;;{{ --DNN,<x,G
  DK+ ))++++ ! :: 2 2$(DM-1D*2 2 2 	2 2 2  <# ,s   E/DE/D DD A<E/7E+84E/-E/E-E/E/D E(,D/-E(1E E(EE(E$	EE$	 E((E/-E/rH   )r   floatr   rZ   r   r   r   zOptional[str])returnr?   r[   None)rF   r   r[   r]   )rI   zOptional[int]r[   r]   )rM   intr[   r]   )r[   bool)r"   
__module____qualname__r   r%   r1   rD   r.   r3   rK   rN   rP   rS   r-    r   r   r	   r	      sg     #,, , 	,
 ,@Z%*X&  r   r	   c                b    t        j                  | t              }t        j	                  |       y rH   )r:   ref_on_executor_deleted
_EXECUTORSadd)executorrd   s     r   r<   r<      s    
++h 4
5CNN3r   c                .    t         j                  |        y rH   )rf   remove)rd   s    r   re   re      s    cr   c                     t         y t        t               } | D ]  } |       }|s|j                           | D ]  } |       }|s|j                  d        d }y )N   )rf   listr.   r3   )	executorsrd   rh   s      r   _shutdown_executorsro      sj     Z I  5NN  5MM!
 Hr   )rh   r	   r[   r]   )rd   z'weakref.ReferenceType[PeriodicExecutor]r[   r]   r\   )__doc__
__future__r   r*   r(   r7   rV   r:   typingr   r   pymongo.lockr   r   r6   r	   setrf   r<   re   ro   rb   r   r   <module>ru      sL    4 "  
      -T  T z U

r   