
    _i,(                        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 ddlmZ ddlmZ dZ G d	 d
          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Optional)_csot)create_task)_create_lockFc                  ^    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S )!AsyncPeriodicExecutorNintervalfloatmin_intervaltargetr   nameOptional[str]c                v    d| _         || _        || _        || _        d| _        d| _        || _        d| _        dS )a  Run a target function periodically on a background task.

        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 task.
        FN)_event	_interval_min_interval_target_stopped_task_name_skip_sleepselfr   r   r   r   s        <D:\Nbitz\venv\Lib\site-packages\pymongo/periodic_executor.py__init__zAsyncPeriodicExecutor.__init__"   sD    " !)26

     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AsyncPeriodicExecutor.__repr__<   3    Y4>*YY$*YYBtHHYYYYYr   Nonec                   d| _         | j        K| j                                        ra| j                                        sJ| j                                        s3t          |                                 | j                  | _        dS dS dS dS )z%Start. Multiple calls have no effect.FN)r   )r   r   done	cancelled
cancellingr   _runr   r*   s    r   openzAsyncPeriodicExecutor.open?   s    :JOO &*j&:&:&<&< EIZEZEZE\E\  %TYY[[tzBBBDJJJ r   dummyc                X    d| _         | j        | j                                         dS 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   cancelr   r4   s     r   closezAsyncPeriodicExecutor.closeH   s5     :!J "!r   timeoutOptional[int]c                `   K   | j         $t          j        | j         g|           d {V  d S d S )N)r:   )r   asynciowaitr   r:   s     r   joinzAsyncPeriodicExecutor.joinR   sG      :!,
|W============ "!r   c                    d| _         dS z!Execute the target function soon.TNr   r*   s    r   wakezAsyncPeriodicExecutor.wakeV       r   new_intervalintc                    || _         d S Nr   r   rF   s     r   update_intervalz%AsyncPeriodicExecutor.update_intervalZ       %r   c                    d| _         d S NTr   r*   s    r   
skip_sleepz AsyncPeriodicExecutor.skip_sleep]       r   c                J  K   t          j                     | j        s| j        r%| j                                        rt
          j        	 |                                  d {V s	d| _        d S n# t          $ r	 d| _         w xY w| j	        rd| _	        n~t          j                    | j        z   }| j        s\t          j                    |k     rEt          j        | j                   d {V  | j        rn| j        st          j                    |k     Ed| _        | j        d S d S NTF)r   	reset_allr   r   r1   r=   CancelledErrorr   BaseExceptionr   time	monotonicr   sleepr   r   r   deadlines     r   r2   zAsyncPeriodicExecutor._run`   sf     - 	 z -dj3355 -,,!\\^^++++++ $(DME !    $  #(  >++dn<- DN,<,<x,G,G!-(:;;;;;;;;;{  - DN,<,<x,G,G
  DK+ - 	  	  	  	  	 s   !A/ /BrI   r   r   r   r   r   r   r   r   r   r    r   r-   r4   r   r   r-   r:   r;   r   r-   rF   rG   r   r-   )r(   
__module____qualname__r   r+   r3   r9   r@   rD   rL   rQ   r2    r   r   r
   r
   !   s         #! ! ! ! !4Z Z Z ZC C C C         > > > > >   & & & &                  r   r
   c                  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 )$PeriodicExecutorNr   r   r   r   r   r   r   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.

        :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)r   r   r   r   r   _threadr   r   _thread_will_exitr   _lockr   s        r   r   zPeriodicExecutor.__init__|   sU    * !)37
 !&!^^


r   r   r    c                T    d| j         j         d| j         dt          |           ddS r"   r&   r*   s    r   r+   zPeriodicExecutor.__repr__   r,   r   r-   c                   | 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)rk   rj   ri   r@   ReferenceErrorr   is_alive	threadingThreadr2   r   daemonweakrefproxy_register_executorstartRuntimeErrorr    sysis_finalizing)r   startedthreades       r   r3   zPeriodicExecutor.open   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r4   c                    d| _         dS r6   )r   r8   s     r   r9   zPeriodicExecutor.close   s     r   r:   r;   c                ~    | j         5	 | j                             |           d S # t          t          f$ r Y d S w xY wd S rI   )ri   r@   rn   rw   r?   s     r   r@   zPeriodicExecutor.join   sZ    <#!!'*****"L1    $#s   % ::c                    d| _         dS rB   rC   r*   s    r   rD   zPeriodicExecutor.wake   rE   r   rF   rG   c                    || _         d S rI   rJ   rK   s     r   rL   z PeriodicExecutor.update_interval   rM   r   c                    d| _         d S rO   rP   r*   s    r   rQ   zPeriodicExecutor.skip_sleep   rR   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 rT   )rk   r   rj   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 rT   )r   r   r   rW   rk   rj   r   rX   rY   r   rZ   r   r   r[   s     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-rI   r]   r^   r_   r`   ra   rb   )r   r   )r(   rc   rd   r   r+   r3   r9   r@   rD   rL   rQ   r   r2   re   r   r   rg   rg   {   s         #$ $ $ $ $@Z Z Z Z' ' ' 'R           & & & &                     r   rg   executorr   r-   c                n    t          j        | t                    }t                              |           d S rI   )rs   ref_on_executor_deleted
_EXECUTORSadd)r   r   s     r   ru   ru     s,    
+h 4
5
5CNN3r   r   'weakref.ReferenceType[PeriodicExecutor]c                :    t                               |            d S rI   )r   remove)r   s    r   r   r     s    cr   c                     t           d S t          t                     } | D ]"} |            }|r|                                 #| D ]#} |            }|r|                    d           $d }d S )N   )r   listr9   r@   )	executorsr   r   s      r   _shutdown_executorsr     s     Z  I   355 	NN   355 	MM!HHHr   )r   rg   r   r-   )r   r   r   r-   r_   )__doc__
__future__r   r=   rx   rp   rX   rs   typingr   r   pymongor   pymongo._asyncio_taskr   pymongo.lockr   _IS_SYNCr
   rg   setr   ru   r   r   re   r   r   <module>r      sW   4 3 " " " " " "  



                             - - - - - - % % % % % %W  W  W  W  W  W  W  W tE  E  E  E  E  E  E  E \ SUU
   
        r   